【问题标题】:Action every x ms, while keeping UI responsive and avoiding multithreading每 x 毫秒执行一次,同时保持 UI 响应并避免多线程
【发布时间】:2011-11-08 17:10:23
【问题描述】:

我有一个 C++/Cli 类库,其类为 Entity。可以使用Jump(destination)(在实体类中)更改实体的位置。

除了使用Jump(destination) 立即更改位置之外,我还需要使用Move(destination) 执行移动。运动的所有点都存储在Trajectory-class 中,我目前正在将运动实现为一系列跳转到这些点,并有一定的延迟:

for(int i = 0; i < trajectory->NumberOfSteps; i++)
{
    // perform one step
    destination = trajectory->Steps[i];
    receivingEntity->Jump(destination);

    // wait
    System::Threading::Thread::Sleep(timePerStep));
}

我从 Windows 窗体 C# 应用程序调用 Move()。我当前的实现显然让我的 UI(在同一个线程中)在 Motion 执行期间冻结。

我正在寻找一种方法来让我的 UI 在运动期间保持响应,以便能够执行诸如点击取消按钮来停止运动之类的事情。 我的一个想法是做类似“在每一步之后,响应事件队列中的任何事件(如 CancelButtonClicked)”。但是如何在 .net 中执行此操作?

for(int i = 0; i < trajectory->NumberOfSteps; i++)
{
    // perform one step
    destination = trajectory->Steps[i];
    receivingEntity->Jump(destination);

    ProcessEventQueue()      // How can I do this?

    // wait
    System::Threading::Thread::Sleep(timePerStep));
}

我的想法或更好的想法有什么解决方案吗?

我意识到我可以用另一个线程来做到这一点,但如果可能的话,我想避免这种情况。

最好的问候 丰富

【问题讨论】:

  • 为什么要避免使用多线程是解决这个问题的明显方法?
  • 嗨,Venemo,我想避免它,因为我已经落后于计划,而且现在开始使用多线程时我害怕遇到新问题。但如果你能提出一个简单的多线程解决方案,我也很乐意在这里。
  • 是的,我可以给你一个使用多线程的简单解决方案。

标签: .net events user-interface c++-cli


【解决方案1】:

如果是WinForms 应用,您可以致电Application.DoEvents。这当然会让你面临重入​​问题,as described in the MSDN documentation

另一种可能更好的方法是使用System.Windows.Forms.Timer

每 n 毫秒启动一次,在每个滴答上执行一次跳转,并在您完成轨迹或用户取消时停止。

【讨论】:

  • 嗨,乔,感谢您的回复。我的帖子关于我的应用程序结构不正确,我现在更正了。 Move() 发生在类库中,但我会尝试在那里发布一个事件,在 UI 中捕获它并在那里执行 Application.DoEvents。也会调查您的计时器解决方案!
【解决方案2】:

我也会选择 Timer 类。

但您可能会导致绘制消息重复创建消息循环。我的 WinForms 有点生疏,但调用 Invalidate 然后捕获绘制消息/事件就足够了。然后,您可以通过计时器或 DateTime 减法来跟踪经过的时间。

【讨论】:

    【解决方案3】:

    如果我是你,我会使用多线程。

    • 在单独的线程上做你现在正在做的事情(动作,然后睡觉)
    • 需要注意的是,您一次只能从一个线程更新 GUI,因此当您想从另一个线程更新 GUI 时,您必须使用 Dispatcher。

    或者,您可以使用 Timer,或者您可以在单独的线程上使用 Timer。

    【讨论】:

    • 感谢 Venemo。你能帮我写一些如何使用 Dispatcher 的代码吗?抱歉我没有这方面的经验:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多