我正在使用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

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

1回复

线程C#中发生异常时,进程未终止

我有一个System.Timers.Timer,我发现,在ElapsedEventHandler异常有时发生,但过程并没有死,但执行ElapsedEventHandler线程quitly死在那里出现异常。 不好,因为那时我还不知道该异常。 为什么流程没有终止? 如果ElapsedEvent
5回复

什么会导致.NET进程/线程意外终止?

我正在尝试收集.NET进程或线程终止原因的完整列表,即使main()方法由try ... catch子句保护也是如此。 此类原因之一就是Thread.Abort()(除非您调用Thread.ResetAbort)。 您知道更多原因吗?
1回复

在Windows上通过参数杀死ID的进程

我想写一个程序来杀死ID。 当我通过name.exe [pid]运行它时,它不起作用。 这是我的代码: 当我不写行 并以第三个参数指定pid number,例如1243: 有用。 我的问题是为什么第一种方法行不通?
6回复

终止进程树(对于Windows为C)

之前已经有人问过这个问题,但是我在代码中找不到明确的答案。 我打开一个进程ProcessA(具有PID 1234)。 该进程将打开一个子进程ProcessAB(PID 5678)。 完成后,我终止了ProcessA,但仍然有ProcessAB的困扰。 如何终止整个过程树? 我的
1回复

防止线程终止影响C中的父进程?

我的目标是创建一个事件处理基础结构,该基础结构将允许注册回调函数以及基于时间的此类函数的调用。 此外,我计划使回调处理程序成为多线程的,因为对回调的类型没有任何限制,因此顺序体系结构可能会导致不必要的阻塞。 从我的研究中,我发现如果线程遇到未定义的行为并被终止(即使用SIGSEGV),则
2回复

C-等待多个线程终止

我试图等待所有线程在main()进程终止之前终止。 这是我到目前为止的内容: 运行此代码时,我得到三个不同的输出。 1-您好\\ n 2- Helle \\ n您好\\ n 3-您好\\ n您好\\ n您好\\ n 看起来main()进程并不总是等待所有线程终止
2回复

Java.util.Timer-主线程结束时进程继续

我有使用util.Timer简单代码 当我运行代码时,该过程将永远运行。 我希望进程在主线程结束时停止。 为什么计时器使进程保持活动状态? 有办法防止吗?
1回复

Windows Scheduler是否跳过处于等待状态的线程? (等待的计时器)

就像标题所说的一样。 如果线程或进程正在使用等待计时器并且处于等待状态,请使用 调度程序是否以不同于work()的方式对待它? 即,如果调度程序为线程预留了(例如)10ms的时隙,但是当它查看线程并意识到它处于等待状态时,调度程序会立即切换回以允许下一个任务尽早启动其时隙; 还是只
1回复

使用计时器在线程内启动应用程序

我有一个线程,在这个线程中,我调用了一个处理时间很长的方法。 该方法有一个foreach ,每次迭代都使用一个计数器(counter ++) 我想做这个: 在foreach ,如果counter> 20: 检查是否正在执行任何名称为“ SendMai
1回复

时间到时的C#进程和线程终止-等待的计时器

我正在尝试创建以下效果: 我有x个线程同时运行,我希望它们在计时器关闭时全部停止。 我唯一能想到的就是拥有一个共享的布尔值,该值会随着时间的流逝而改变。 有谁知道如何通过线程计时器和AutoResetEvent做到这一点? 我很难找出如何使用自动重置事件... 您知道实