设计模式,Qt模型/视图和多线程

shi*_*wla 12 c++ model-view-controller qt

我正在创建一个显示市场数据的应用程序,并以其他形式使用它.我将市场数据存储在地图中 std::map<tickerId, StockData>.让我举一个关于如何使用这个地图的例子.

  1. 网络在时间t发送封装库存数据的数据包. updatePrice(tickerId, latestPrice)
  2. 更新地图中的库存数据.现在,多个线程可以访问/更新数据.因此必须锁定映射以进行线程安全操作.这是第一个问题,我是否还需要锁定基础数据以进行更新?
  3. 新股票数据有多种用途,比如说IBM有价格更新,那么我需要在我的投资组合中更新IBM的价值.以及在屏幕上显示新数据.并且可以有其他几种同时使用.updatePosition(tickerId, price)updateStockScreen(tickerId, price).此外,从位置更新中分离Gui更新非常重要,因为GUI不是应用程序的主要优势.
  4. 我对如何实现这种类型的设计感到困扰.我在QT中阅读了有关模型/视图设计的信息,但是如果View线程从同一个地图读取,则必须将其锁定.这导致设计缓慢/低效.每次视图从模型中读取时,都需要锁定模型.这是在实时GUI中提供的吗?
  5. 总而言之,我已经将许多不同的对象存储为地图.对象实时更新.我需要更新它们,然后在不同的位置使用它们.如果有人能给我一个关于如何实现这种设计的小例子,那就太好了.

对有用书籍的一些参考也受到赞赏.

我是新人,并试图通过我的小知识实现太多,所以如果我问过愚蠢/形成错误的问题,请原谅我.

谢谢Shiv

Hos*_*ork 11

这听起来在概念上就像你想要一个线程上的模型和另一个线程上的视图,我在一个点上看到了.

如果是这样......并且您的模型通过视图小部件是只读的,那么是的,您必须锁定.我认为这样做会破坏模型/视图分离所提供的"解耦"的优雅.但它可以成功.

但是...如果你的模型是通过它不可能做正确的观点读写因为通知插槽排队的性质.这是我在qt-interest邮件列表上关于该主题的邮件列表对话的存档:

http://blog.hostilefork.com/qt-model-view-different-threads/

"简短的版本是我认为
在非GUI线程上修改模型是不可行的......无论模型的
数据是否受到读/写锁的保护.如果我收集的
是正确,那么Qt应该有一个断言,模型
及其视图具有相同的线程关联(现在似乎没有这样做)"

由KDE开发人员进行的后续单元测试验证了这一点.

我觉得解决这个问题的最好方法是将模型和视图保持在同一个线程上,并且只修改GUI线程中的模型.因此,如果工作者线程希望更改它,那么它应该使用信号.

工作者是否需要保留自己创建模型的数据副本(或者当用户通过视图更改模型时是否需要通知以使其保持最新)取决于您的应用程序.如果我理解正确的话,听起来好像你可能只是通过信号/插槽传送更新而忘记工作人员......