我正在使用Windows线程在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;
}

===============>>#1 票数:0

使用CreateEvent(NULL,FALSE,FALSE,NULL)函数创建一个事件,将此事件句柄传递到线程中,然后在线程过程中,使用WaitForSingleObject(hEvent,1000)代替。 每当您要停止线程时,请调用SetEvent(hEvent) ,然后在线程proc中执行以下操作:

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

===============>>#2 票数:0

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

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

  ask by Mario Camia translate from so

未解决问题?本站智能推荐: