伪实时线程

时间:2010-11-18 19:09:43

标签: multithreading user-interface asynchronous real-time threadpool

所以我构建了一个具有物理引擎和显示器的小应用程序。显示器连接到一个处理物理引擎的控制器(实际上是一个处理控制器的视图模型,但细节)。

目前,控制器是一个委托,它由一个begin-invoke激活,并由一个取消令牌取消激活,然后由endinvoke收集。在lambda内部刷了PropertyChanged(挂钩到INotifyPropertyChanged),它使UI保持最新。

据我所知,BeginInvoke方法激活一个任务而不是另一个线程(在我的计算机上确实激活另一个线程,但这不是我所做的读取的保证,它取决于线程池的方式。完成任务),这对我所做的所有测试都没问题。在取消CancellationToken之前,lambda不会完成。它有一个睡眠和更新(所以它有点模拟一个实时物理引擎...它很粗糙,但我不需要真正的实时精度,只需要感觉一点)

我的问题是,这会在其他计算机上运行,​​还是应该切换到我启动和取消的显式线程?我想到的情况是1核处理器,第二个任务是否可能大大减少处理器时间,从而使我可接受的不准确模型成为不可接受的不准确的东西(即在切换之前等待毫秒而不是微秒?)。或者他们是否有更好的方法来做到这一点,我还没有提出来?

1 个答案:

答案 0 :(得分:1)

根据我的经验,以你所描述的方式使用线程池几乎可以保证在大多数计算机上具有合理的最佳性能,而不必麻烦地弄清楚如何分割线程。

线程与核心不同;你仍然可以在单核机器上获得多个线程,并且这些线程将分别承担处理负载的一部分。你不会得到你描述的“死锁”状态,除非你对线程做了一些不寻常的事情,比如给它们一个实时优先级。

也就是说,微秒并不是很多时间用于线程之间的上下文切换,所以YMMV。你必须尝试一下,看看它有多好用;可能需要进行一些调整。