异步函数调用,带有检查进度的方法
Posted
技术标签:
【中文标题】异步函数调用,带有检查进度的方法【英文标题】: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
。
【参考方案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
似乎没有必要。
【讨论】:
谢谢。多么愚蠢的错误。现在它似乎工作了以上是关于异步函数调用,带有检查进度的方法的主要内容,如果未能解决你的问题,请参考以下文章
Unity 单元测试 - 检查带有参数的函数调用是不是引发异常