2016-03-21 1 views
1

C++で非同期関数呼び出しを実装するのに助けが必要です。私はC++でマルチスレッド化するのが初めてです。進行状況をチェックするメソッドを持つ非同期関数呼び出し

2つの機能があります.1つは別のスレッドで作業を開始し、もう1つは進行状況を確認し、作業が終了しています。

このサイトのさまざまな回答からいくつかのコードを試しましたが、うまくいきません。私は次のエラーを取得asyncStartWorkを呼び出すとき

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 
} 

:方法Test::asyncStartWork()

enter image description here

+1

[MCVE]が必要です。あなたの実際の問題の説明。 – Yakk

+0

あなたのスレッドオブジェクトはローカルで、 'asyncStartWork'の終わりに破壊されます。迅速な修正は 'detach'でしょう。 – knivil

答えて

1

を、あなたのクラスメンバを隠しているローカル変数workThreadを定義しています。

asyncGetProgress()では、workThread.join()を呼び出すときに、スレッドを表さないスレッドオブジェクト(hereを参照)を呼び出しています。

この結果、エラー状態no_such_processstd::system_errorがスローされます。あなたのプログラムが例外をキャッチしていない場合、プロセスが中止されます。

std::thread部分をasyncStartWork()に削除してみてください。

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

また、__stdcallは不要です。

+0

ありがとうございます。どのような愚かな間違い。今はうまくいくようです – rkgghz

関連する問題