代码之家  ›  专栏  ›  技术社区  ›  Snark

伪实时线程

  •  0
  • Snark  · 技术社区  · 14 年前

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

    当前,控制器是一个委托,由begin调用激活,由cancellation令牌停用,然后由endinvoke获取。在lambda笔刷PropertyChanged(连接到INotifyPropertyChanged)中,它使UI保持最新。

    据我所知,BeginInvoke方法激活的是一个任务,而不是另一个线程(在我的计算机上,它确实激活了另一个线程,但这并不能保证从我所做的阅读来看,这取决于线程池它希望如何完成任务),从我所做的所有测试来看,这是很好的。直到CancellationToken被杀死,lambda才完成。它有一个睡眠和一个更新(所以它有点像一个实时物理引擎…它很粗糙,但我不需要实时的精确性,只需要足够的感觉)

    我的问题是,这是否适用于其他计算机,或者我应该切换到显式线程,我启动和取消?我正在考虑的场景是在一个单核处理器上,是否有可能第二个任务将获得大量更少的处理器时间,从而使我可接受的不精确模型变成不可接受的不精确(即,在切换之前等待毫秒而不是微秒?)或者是他们做这件事的更好的方法,我还没有想到?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Robert Harvey    14 年前

    以我的经验,以您描述的方式使用线程池将在很大程度上保证大多数计算机上的性能达到合理的最佳,而不必费心去想如何划分线程。

    一个线程和一个核心不一样;在一个核心机器上仍然会有多个线程,这些线程将各自承担部分处理负载。除非你对线程做了一些不寻常的事情,比如给它们一个实时优先级,否则你不会得到你描述的“死锁”条件。

    也就是说,微秒并不是线程间上下文切换的大量时间,所以YMMV。你必须尝试一下,看看效果如何;可能需要一些调整。