【问题标题】:How do I Yield() to another thread in a Win8 C++/Xaml app?如何在 Win8 C++/Xaml 应用程序中向另一个线程 Yield()?
【发布时间】:2014-03-19 02:00:00
【问题描述】:

注意:我使用的是 C++,而不是 C#。

我有一些代码可以进行一些计算,还有一些代码使用结果。使用结果的位已经在任务中,但原始计算不是——它实际上在主线程的 App::App() 初始化的调用堆栈中。

在过去,我会使用:

while (!computationIsFinished())
    std::this_thread::yield(); // or the like, depending on API

然而,对于 Windows 应用商店应用程序(又名 WinRT,pka Metro 风格),这似乎不存在。我不能使用延续,因为使用结果的位与原始计算发生的位置无关——而且该计算无论如何都不是任务。

搜索找到 Concurrency::Context::Yield(),但 Windows 应用商店应用似乎不存在上下文。

所以...假设我在后台线程上执行任务。我如何yield?特别是,我如何在 while 循环中产生?

【问题讨论】:

  • 你能把计算封装在一个任务中吗?
  • 不,在初始化时需要,在主线程上,我不想阻塞主线程。我知道还有其他异步编程方式,我主要想知道 yield 是否仍然有效。

标签: multithreading windows-runtime c++-cx


【解决方案1】:

首先,在构造函数中进行昂贵的计算通常不是一个好主意。当它是“App”类时更是如此。此外,在 WinRT 模型中几乎禁止在主 (ASTA) 线程中执行繁重的工作。

您可以使用concurrency::task_completion_event<T> 将不面向任务的代码与其他相关工作相连接。

例如在长序列代码中:

...

task_completion_event<ComputationResult> tce;

task<ComputationResult> computationTask(tce); 

// This task is now tied to the completion event. 
// Pass it along to interested parties.

try
{
    auto result = DoExpensiveComputations();

    // Successfully complete the task.
    tce.set(result);
}
catch(...)
{
    // On failure, propagate the exception to continuations.
    tce.set_exception(std::current_exception());
}

...

应该可以很好地工作,但我还是建议将计算分解为自己的任务,并且可能会在构建过程中不执行它开始...肯定是响应式 UI 的反模式。 :)

【讨论】:

  • 我不确定你从哪里得到这是“昂贵”计算的想法,但事实并非如此。对于我的问题,看起来完成事件会起作用。但是,我仍然想知道:有什么方法可以 yield() 吗?
【解决方案2】:

Qt 只是在其 WinRT yield 实现中使用 Sleep(0)。

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多