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 回答