如何结束Windows for Thread in

时间:2011-12-11 19:58:34

标签: c multithreading process timer terminate

我正在使用Threads for C在C中进行游戏,但是在游戏中我需要在特定时刻停止一些线程,我不知道我需要停止线程的函数和参数是什么它返回。

这个2函数是相同的,一个运行到计数器达到限制的简单计时器,我想在我想要的时候停止第二个线程,而不使用WaitForSingleObject的第二个参数(hThread,Miliseconds)。

DWORD WINAPI timer(LPVOID segundo)
{

    int counter = 0;
    while(counter<segundo)
    {
        counter++;
        gotoxy(30,5);
        printf("%d", counter);
        Sleep(1000);
    }
    return NULL;
}

DWORD WINAPI prueba(LPVOID segundo)
{
    int counter = 0;
    while(counter<segundo)
    {
        counter++;
        gotoxy(30,10);
        printf("%d", counter);
        Sleep(1000);
    }
    return NULL;
}

int main()
{
    int limit = 5, *ptr;
    *ptr = limit;
    HANDLE hThread1, hThread2;
    DWORD time, probo;
    hThread1 = CreateThread(NULL, 0, timer, *ptr, 0, &time);
    hThread2 = CreateThread(NULL, 0, prueba, *ptr, 0, &probo);
    WaitForSingleObject(hThread2, INFINITE);
    WaitForSingleObject(hThread1,INFINITE);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

使用CreateEvent(NULL,FALSE,FALSE,NULL)函数创建事件,将此事件句柄传递给线程,然后在线程过程中使用WaitForSingleObject(hEvent,1000)代替。每当你想要停止线程时,调用SetEvent(hEvent),然后在线程proc中,执行:

DWORD retval = WaitForSingleObject(hEvent,1000);
if( retval != WAIT_TIMEOUT )
    return 0;

答案 1 :(得分:0)

在C中,通常使用全局BOOLbTerminated,最初设置为FALSE。线程重复检查其值,例如在您的线程函数while(counter<segundo && !bTerminated)中将被写入。想要停止线程的代码的任何其他部分都应该将bTerminated设置为TRUE,并且需要通过调用WaitForSingleObject来等待线程停止。如果您有多个线程,则可以为每个线程使用这样的逻辑变量。

此解决方案也是Delphi中的标准方法,但在这种情况下,bTerminated变量是TThread类的字段,并设置为调用Terminate方法的true bay。在C ++中也有类似的实现。