2016-03-21 28 views
1

我需要帮助来实现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我得到以下错误:

enter image description here

+1

[MCVE]是必要的。并描述你的实际问题。 – Yakk

+0

你的线程对象是本地的,并且会在'asyncStartWork'结尾处被破坏。快速解决将是'分离'。 – knivil

回答

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似乎没有必要。

+0

谢谢。多么愚蠢的错误。现在它似乎工作 – rkgghz