带有等待功能的简单线程

Simple thread with wait function

本文关键字:简单 单线程 功能 等待      更新时间:2023-10-16

我不明白为什么下一个代码不起作用。它编译正确,但不会输出任何内容。你能帮我吗?

HANDLE hEvent;
unsigned int WINAPI MyThread(void *p)
{
    WaitForSingleObject(hEvent, INFINITE);
    _tprintf(TEXT("%sn"),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;
}

我的猜测是该应用程序甚至在打印语句启动之前退出。您将活动设置,然后立即退出。在退出之前,请尝试等待线程完成。您应该能够使用从_beginthreadex返回的句柄。

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

注意:我只是使用无限的时间来示例,通常您可能不希望无限,这可能会导致僵局等。需要检查每种情况以确定正确的行为。在这里,由于您只是写信给控制台,如果几秒钟内没有返回,可能会出现问题。您可以修改代码以检查WaitForsingLeoBject的返回值,以查看它是否由于超时而退出,然后根据该决定(例如Log a Orror,或者有助于诊断出什么问题)做出决定)

<) div class =" ans">

您的程序甚至在线程启动之前就停止。

将其放在return 0;的前面,您应该得到一些结果

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

retval还将帮助您查看线程的结束方式(鉴于您有不同的出口代码,例如_endthreadex(6);