我无法理解为什么下一个代码不起作用。它编译正确,但不输出任何东西。你能救我吗?
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;
}
答案 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);
)