发布
社区首页 >问答首页 >使用ExitThread -C关闭线程

使用ExitThread -C关闭线程
EN

Stack Overflow用户
提问于 2010-03-19 13:19:41
回答 5查看 13.3K关注 0票数 2

我有一个简单的程序,它创建一个线程,循环20次,然后调用关闭自己并执行必要的清理。

当我调试程序时,它会到达ExitThread();方法并暂停,忽略printf();在它之后设置它以向我发出关闭的信号。

这是正常的还是我忘了做些什么?我不熟悉使用C进行线程处理。

Main()

代码语言:javascript
代码运行次数:0
复制
void main()
{
    Time t;
    int i = 0;

    StartTimer();

    for(i = 0; i < 20; i++)
    {
        t = GetTime();
        printf("%d.%.3d\n", t.seconds, t.milliseconds);
        Sleep(100);
    }
    StopTimer();
}

线程创建

代码语言:javascript
代码运行次数:0
复制
void StartTimer()
{
    DWORD threadId;
seconds = 0;
milliseconds = 0;

// Create child thread
hThread = CreateThread(
    NULL,       // lpThreadAttributes (default)
    0,          // dwStackSize (default)
    ThreadFunc, // lpStartAddress
    NULL,       // lpParameter
    0,          // dwCreationFlags
    &threadId   // lpThreadId (returned by function)
    );

// Check child thread was created successfully
if(hThread == NULL)
{
    printf("Error creating thread\n");
}
}

线程关闭

代码语言:javascript
代码运行次数:0
复制
void StopTimer()
{
    DWORD exitCode;

    if(GetExitCodeThread(hThread,&exitCode) != 0)
    {
        ExitThread(exitCode);   
        printf("Thread closed");

        if(CloseHandle(hThread))
        {
            printf("Handle closed");
        }
    }
}

编辑:

我已经意识到ExitThread()停止执行线程,因此我尝试使用另一种方法来停止计时器,但结果仍然是一样的。

代码语言:javascript
代码运行次数:0
复制
void StopTimer()
{    
    WaitForSingleObject(hThread,INFINITE);
}

解决方案:

程序在WaitForSingleObject()调用时停止而不进行的原因,无论花费多长时间,都是因为它正在等待的操作有一个无限循环。

它将等待一个无限循环完成,而不是最好的事情。将WaitForSingleObject()的延迟更改为更合理的内容,例如100,可以使程序正常运行。

谢谢你的投入。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-19 13:26:04

是的,这是“正常的”,通过调用ExitThread,您告诉windows您已经完成了调用线程,所以其余的代码不会被调用。这有点像调用exit(0)。

就我个人而言,我不会这样用它。代码的其余部分是可以的,您正在正确地清理线程,只需正常退出线程函数即可。

票数 2
EN

Stack Overflow用户

发布于 2010-03-19 13:23:23

这是正常的,因为ExitThread实际上退出了当前线程,因此它永远不会返回,下面的指令将永远不会执行。

顺便说一句,您不应该直接调用ExitThread (除非您真的知道自己在做什么):您只需从线程函数返回即可。

然后,如果使用C运行时库,则不应该使用原始线程API,而是使用C运行时库(如_beginthread和_beginthreadex )。

票数 1
EN

Stack Overflow用户

发布于 2010-03-19 13:25:17

ExittThread函数立即终止调用线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2477550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档