2011-08-17 4 views
6

C++(Windows)でスレッドの戻り値を取得することが可能かどうか(もしそうであれば)どうすればいいでしょうか。私はいくつかのスレッドを持っており、それらにWaitForMultipleObjects(...)を使用しています。これは、スレッドが完了するまで待機し、前記スレッドのインデックスを返し、すべてがうまくいきます。しかし、ハンドルを使用して終了したスレッドの戻り値を取得できるようにしたい。例えばWindowsスレッドの戻り値を取得するにはどうすればよいですか?

DWORD WINAPI Thread1(void *parameter){ 
    ... 
    if(...) return 0; 
    else return -1; 
} 

DWORD WINAPI Thread2(void *parameter){ 
    ... 
    if(...) return 1; 
    else return 0; 
} 

int main(){ 
    HANDLE t1 = CreateThread(0, 0, Thread1, NULL, 0, 0); 
    HANDLE t2 = CreateThread(0, 0, Thread2, NULL, 0, 0); 
    HANDLE *threads = new HANDLE[2]; 
    threads[0] = t1; 
    threads[1] = t2; 
    int result = WaitForMultipleObjects(2, threads, false, INFINITE); 
    if(result == 0){ 
     //get the threads value here: 
     int retVal = SomeFunction(t1); //What is SomeFunction? 
    } 
    ... 
} 

私はGetExitCodeThread(thread)を使用しようとしましたが、それはいつも私に非常に奇妙な整数を与えるように私は、これはシステムの終了コードを返すと仮定しています。誰か方法、または回避策を知っていますか?

+3

私は常にGetExitCodeThreadを使用しています。正しく使用していますか?これは、スレッドハンドルとDWORDへのポインタをとり、GetExitCodeThreadの成功を返します(_not_はスレッドの戻り値ではありません)。 –

+0

あなたの質問は私の答えです。 – Koying

答えて

11

GetExitCodeThreadが正しい関数でアクティブにできるの値についてSTILL_ACTIVEをチェックする必要があります。

この関数は、すぐに戻ります。指定されたスレッドが で終了せず、関数が成功した場合、返されるステータスは STILL_ACTIVEです。 ExitThreadまたはのTerminateThread関数で指定された終了値

  • :スレッドが終了したと関数が成功した場合、返さ ステータスは、以下のいずれかの値です。
  • スレッド関数からの戻り値。
  • スレッドのプロセスの終了値。
+2

'GetExitCodeThread(t1、&retVal)'と返された4294967295(retValはDWORDです)です。スレッドの実際の戻り値は-1でした。私はちょうどネガにリバウンドしたintを考え出しました。一口... – Sefu

1

あなたはこれらのスレッドの1はまだ

3

ほとんどのプログラマーの問題は、コンパイラの警告に注意を払わないことです。

warning C4245: 'return' : conversion from 'int' to 'DWORD', signed/unsigned mismatch

0

あなたはstd::futureを使用してC++ 11のスレッドの概念を使用することができます。レベル4(/ W4)で、コンパイラがDWORDを返す関数から-1を返すときに警告を以下の生成します。
以下の例を参照してください。

int ReturnFrmThread() { 
    return 100; 
} 

int main() { 
    std::future<int> GetRetVal= std::async(ReturnFrmThread); // Execution of ReturnFrmThread starts 
    int answer = GetAnAnswer.get(); // gets value as 100; 
    // Waits until ReturnFrmThread has finished 
} 
関連する問題