【问题标题】:How can I end a Thread in for Windows如何在 Windows 中结束线程
【发布时间】:2011-12-11 19:58:34
【问题描述】:

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

这两个函数是相同的,一个简单的计时器,一直运行到计数器达到限制,我想随时停止第二个线程,而不使用 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;
}

【问题讨论】:

  • 请问您为什么要这样做?线程协同工作。你发信号给一个线程做某事,然后等到它完成。在这里,您将向线程发出您希望它暂停的信号,然后等待它暂停。听起来这不是您的想法,这可能是设计缺陷的征兆。

标签: c multithreading process timer terminate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多