一个线程,属于复杂计算,需要合理的启停之。想问下,如果想能让停止动作比较及时的能完成,有什么好办法?因为一般线程停止动作最好是由自己触发,那我在外部想停止它的话一般是用事件或者标志位。对于一个大量代码复杂计算的线程,是不是只能每行之间插入检测代码?或者在for循环每次插入检测代码,检测停止事件是否到来? 不然的话,那些没有检查停止信号的代码段,是不受控的吧?   
曾经考虑过TerminateThread来,不过查了下,对这个函数一般都不怎么推荐使用 ,涉及到泄漏等问题。想请问下,有没有什么比较好的“中断”方式,能让线程对外界响应更及时

解决方案 »

  1.   

    一般都用事件停止,你也可以发消息,在线程中自己GetMessage
      

  2.   

    复杂运算的线程要及时停止没有什么特别好的办法。TerminateThread强制结束,但会有泄漏问题。将计算过程分为几部分,每部分开始前判断是否要结束,这样子勉强凑合
      

  3.   

    是这样的。既然你线程中存在比较耗费时间的操作,而你又要要求能及时停止线程运行,这本身就是一种矛盾的要求。
    除非你在外部调用TerminateThread,而这又是你接受不了的。
      

  4.   

    想问下,如果不得已只能调用TerminateThread,能不能有什么方式能让线程的结束安全、资源不泄漏
      

  5.   

    SuspendThread(tThread);
    // 自己释放相关内存
    TerminateThread(tThread,0);
      

  6.   

    加个标志或者使用事件对象,最好让线程自己return返回,不要使用TerminateThread()函数强制接受线程
      

  7.   

    不太理解楼主的线程是什么工作,那只有TerminateThread了
      

  8.   

    SuspendThread(tThread);   
    // 自己释放相关内存
    TerminateThread(tThread,0);复杂计算当中的线程,能SuspendThread下来么? 如果能,这个SuspendThread函数会阻塞一段时间吗?如果会,也没法用。释放相关内存指得是哪些?
      

  9.   

    想强停的话,TerminateThread这玩意没法很好的使用么...
      

  10.   

    第一个, 线程里的肯定是个带bool标志的死循环
    第二个, 退出时把标志置为false, 然后添加如下语句        DWORD dwExit = 0;
    while (TRUE)
    {
    if (m_pThread != NULL)
    {
    DWORD dwExit;
    if (GetExitCodeThread(m_pThread->m_hThread, &dwExit))
    {

    Sleep(1);
    continue;
    }
    } break;
    }
      

  11.   


    这个就是退出的函数。 你退出时, 置此标志为false。 线程下次循环当然会退出了。 
      

  12.   


    明白了。 是你的线程里 sleep(5000), 是吧?  这个好办, 修改下Sleep, 如下:
    void CMuZiZongHeng::mf_Sleep(DWORD dwMS, const BOOL &bStop)
    {
    DWORD dwTickstart = GetTickCount();
    while(!bStop)
    {
    if ( (GetTickCount() - dwTickstart) > dwMS)
    {
    break;
    } Sleep(1);
    }
    }你在线程里用mf_Sleep(5000, 你的线程的bool标志);
      

  13.   

    不是Sleep的时间,是计算的时间,5分钟我是举个例子
      

  14.   

    这和你的循环方式无关,你需要修改  循环体内部调用的 各个函数本身。
    你也可以这样设计,把计算中需要的资源都分配好,创建线程  等待线程退出 如果想停止了,就terminate,然后清理资源。
      

  15.   

    这个方式可能是我要找的方式,想确认下,如果这种方式,调用terminatethread就不会泄露了吗?就怕还有啥别的东西泄露
      

  16.   

    这个方式可能是我要找的方式,想确认下,如果这种方式,调用terminatethread就不会泄露了吗?就怕还有啥别的东西泄露
      

  17.   

    根据我对《核心编程》的理解, 你要用CreateThread创建的线程用 TerminateThread 应该没多大问题
    如果用 _beginthreadex的话,貌似就会有问题了我想,这种方式还不是好方式,最根本就是修改 你调用的那些函数,不要一次就占用那么长时间
      

  18.   

    我最近也遇到跟你这个类似的问题~百思不得其解。现每行都IF还是不能完美的解决!真想直接TerminateThread