【问题标题】:Asynchronous function call, with a method to check progress异步函数调用,带有检查进度的方法
【发布时间】:2016-03-21 14:09:57
【问题描述】:

我需要帮助才能在 C++ 中实现异步函数调用。我是 C++ 多线程的新手。

应该有两个功能:一个是在另一个线程中开始工作,另一个是检查进度以及工作是否已完成。

我用这个网站上不同答案的一些代码尝试了它,但它不起作用。

int __stdcall Test::asyncStartWork()
{
    asyncReady = false;
    std::thread workThread = std::thread(&Test::doWork, this);
    return 0;
}

int __stdcall Test::asyncGetProgress()
{
    if (asyncReady = true)
    {
        workThread.join();
        return 100;
    }    
    else
    {
        return asyncProgress;
    }
}

int __stdcall Test::doWork()
{
   //do work and write progress to asyncProgress

   //at the end
   asyncReady = true
}

调用 asyncStartWork 时出现以下错误:

【问题讨论】:

  • minimal reproducible example 是必需的。并描述您的实际问题。
  • 你的线程对象是本地的,会在asyncStartWork结束时被销毁。快速解决方法是detach

标签: c++ multithreading asynchronous


【解决方案1】:

在方法Test::asyncStartWork() 中,您定义了一个局部变量workThread,它隐藏了您的类成员。

所以在asyncGetProgress() 中,当调用workThread.join() 时,您是在为一个不代表线程的线程对象调用它(参见here)。

这导致std::system_error 被抛出,错误条件为no_such_process。如果您的程序没有捕获异常,这将导致进程中止。

尝试删除asyncStartWork() 中的std::thread 部分,例如

int __stdcall Test::asyncStartWork()
{
    asyncReady = false;
    workThread = std::thread(&Test::doWork, this);
    return 0;
}

另外,__stdcall 似乎没有必要。

【讨论】:

  • 谢谢。多么愚蠢的错误。现在它似乎工作了
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多