带等待功能的简单线程

时间:2012-10-17 18:39:36

标签: c++ multithreading winapi

我无法理解为什么下一个代码不起作用。它编译正确,但不输出任何东西。你能救我吗?

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;
}

3 个答案:

答案 0 :(得分:1)

你的程序在线程开始之前停止。

答案 1 :(得分:1)

我的猜测是应用程序在print语句出现之前就已退出。您设置事件然后立即退出。在退出之前尝试等待线程完成。您应该能够使用从_beginthreadex返回的句柄。

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

注意:我只使用INFINITE作为示例的超时,通常您可能不希望INFINITE可能导致死锁等。需要检查每个案例以确定正确的行为。在这里,由于您只是写入控制台,如果几秒钟内没有返回,可能会出现问题。您可以修改代码以检查WaitForSingleObject的返回值,以查看它是否因超时而退出,然后根据它做出决定(比如记录错误,或者有助于诊断出错的地方)

答案 2 :(得分:0)

将它放在return 0;前面,你应该得到一些结果

DWORD retVal;
GetExitCodeThread(hThread1, &retVal);

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

retVal还可以帮助您查看您的主题如何结束(假设您有不同的退出代码,例如_endthreadex(6);

相关问题