我需要实现一个统计报告器 - 一个打印到屏幕上的统计信息的对象。 此信息由20个主题更新。
记者必须是一个每1秒唤醒一次的线程,阅读信息并将其打印到屏幕上。
到目前为止我的设计: InfoReporterElement - 信息的一个元素。有两个函数,PrintInfo和UpdateData。 InfoReporterRow - 屏幕上有一行。一行包含ReporterInfoElement的向量。 InfoReporterModule - 由标题和行向量组成的模块。 InfoRporter - 由一组模块和一个标题组成的记者。记者导出遍历所有模块\行\基本元素的函数'PrintData',并将数据打印到屏幕上。
我认为我应该负责从线程接收更新并更新基本信息元素。
主要问题是如何更新信息 - 我应该为对象使用一个互斥锁还是每个基本元素使用互斥锁? 另外,哪个对象应该是线程 - 报告者本身,还是从线程接收更新的线程?
答案 0 :(得分:1)
主要问题是如何更新 info - 我应该使用一个互斥量 对象或每个基本元素使用互斥?
在更新操作的基本单元周围放置一个互斥锁。如果这是InfoReporterElement
对象,则每个此类对象需要一个互斥锁。否则,如果一次更新一行,则由任何一个线程将该互斥锁放在该行周围,依此类推。
另外,哪个对象应该是一个线程 - 记者本身,还是收到线程更新的那个?
您可以将它们全部放在不同的线程中 - 更新信息的多个编写器线程和读取值的一个读取器线程。
答案 1 :(得分:1)
我想首先,Reporter
本身应该是一个主题。它是基于解耦以将绘图部分与活动代码(MVC)隔离的基础。
结构本身在这里用处不大。当您使用多线程进行推理时,其结构与您应该检查的信息流量的关系不同。
这里有20个活动主题用于更新信息,1个被动主题将显示该主题
。这里的问题是你遇到了在工作中引入一些延迟的风险,因为活动线程无法获取锁(用于显示)。报告(或记录)不应该阻止(或尽可能少)。
我建议引入一个中间结构(和线程)来分离GUI和工作:排队线程。
您可以使用与Graphics相同的构思来避免某些同步问题。使用2个缓冲区:当前的缓冲区(由显示线程显示)和下一个缓冲区(由排队线程更新)。当排队线程处理了一批事件时(由你决定批处理是什么),它要求交换2个缓冲区,以便下次显示的线程显示新的信息。
注意:更个人化的说法,我不喜欢你的结构。工作线程必须准确知道它应该更新的元素在屏幕上的哪个位置,这明显违反了封装。
再一次,查找MVC。
因为我的模式很深入:查找Observer
;)
答案 2 :(得分:0)
您似乎非常了解并发的基础知识。
我的初衷是一个队列,它有一个锁定写入和删除的互斥锁。如果你有时间,我会看看无锁访问。
对于你的第二个问题,我只有一个读者线程。
答案 3 :(得分:0)
一段代码可以很好地操作。
将互斥锁附加到每个InfoReporterElement
。正如你在评论中写的那样,你不仅需要获取和设置元素值,还要增加它或者可能做其他的东西,所以我要做的是为每个互锁操作制作一个互斥成员函数强>我需要。