1

次のコードが機能しない理由がわかりません。正しくコンパイルされますが、何も出力されません。手伝って頂けますか?

HANDLE hEvent;
unsigned int WINAPI MyThread(void *p)
{
    WaitForSingleObject(hEvent, INFINITE);
    _tprintf(TEXT("%s\n"),p);
    return 0;
}

int _tmain(int argc, TCHAR *argv[])
{
    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    unsigned int ThreadID;
    HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, MyThread, L"hello world", 0, &ThreadID);
    SetEvent(hEvent);
    return 0;
}
4

3 に答える 3

1

スレッドが開始される前にプログラムが停止します。

于 2012-10-17T18:42:47.500 に答える
1

私の推測では、print ステートメントが起動する前にアプリケーションが終了していると思われます。イベントを設定すると、すぐに終了します。終了する前に、スレッドが完了するのを待ってみてください。_beginthreadex から返されるハンドルを使用できるはずです。

HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, MyThread, L"hello world", 0, &ThreadID);
SetEvent(hEvent);
WaitForSingleObject( hThread1, INFINITE );

注: 例として、タイムアウトとして INFINITE を使用しました。一般に、デッドロックなどにつながる可能性のある INFINITE は望ましくないでしょう。正しい動作を判断するには、それぞれのケースを調べる必要があります。ここでは、コンソールに書き込みを行っているだけなので、これが数秒以内に返されない場合は、おそらく何か問題があります。コードを変更して、WaitForSingleObject の戻り値をチェックし、タイムアウトが原因で終了したかどうかを確認し、それに基づいて決定を下すことができます (エラーをログに記録するか、何が問題なのかを診断するのに役立つ何か)。

于 2012-10-17T18:43:23.880 に答える
0

これをあなたの前に置くreturn 0;と、いくつかの結果が得られるはずです

DWORD retVal;
GetExitCodeThread(hThread1, &retVal);

while(retVal == STILL_ACTIVE) {
    Sleep(1000);
    GetExitCodeThread(hThread1, &retVal);
}

retValは、スレッドがどのように終了したかを確認するのにも役立ちます(たとえば、異なる終了コードがある場合_endthreadex(6);

于 2012-10-17T18:46:14.253 に答える