定时读数据,这个听起来很简单,
有很多选择可以作。
但下面这种情况呢.
定时执行一段函数。这个函数是网络访问的,通常很快会跑完,但此时网络异常了,这个函数会很久才返回
如果你是简单的使用WM_TIMER的话,你就惨了。整个界面不动了。
这里想到了把这段放到线程里面去做。
但有个性能问题.
线程内部是循环的呢,还是执行完就退出,WM_TIMER到又创建线程呢.
我想应该前者好些,因为创建线程,系统需要开销.如果wm_timer 频率有点高,不停的创建线程,这…………
所以我想到了用线程内部循环.
类似代码while(???)
{
do something.
sleep(2000);
}这个时候又有新问题产生了
主程序关闭的时候,如何通知这个子线程正常退出呢.
有人说用全局变量。While(一个全局变量).但此时,线程正好在Sleep呢 …………
这段时间线程不会主动关闭噻这个问题有没有完美的解决方案,
我能开200分,有正确答案200分奉上,请效纳.

解决方案 »

  1.   

    这个问题有多种方法 
    1你可以有两个创建线程和结束线程的函数 如Start和Stop 利用一个内核对象event或者mutex使线程实例唯一 
    2或者总是创建线程 但线程函数中使用关键段禁止同时执行 不如1
    3通知线程结束你可以用waitforsingleobject来代替Sleep,Stop时激发一个事件,是线程比较自然的返回
      

  2.   

    全局事件,一直是不设置,超时设置成2秒钟,你的sleep(2000)换成WaitForSingleObject(hEvent, 2000),然后退出前,外部直接设置下事件
     
      

  3.   

    无论工作线程还是主线程,一定不要sleep,问题很多。用事件或消息取代sleep即可,控制起来比sleep容易得多。LZ的情况可以采用两个事件A和B,A与定时器相关,B与退出相关。工作线程的线程函数很好写,自己动动手吧。
      

  4.   

    我这个要定时访问。
    我不想定时创建线程
    那么只创建一个线程,线程不能一直访问噻,是过一会再做事噻
    做完事后,线程就不工作,使用sleep解决。但是刚好在sleep时,怎么关闭
      

  5.   

    有个方法,创建一个UI线程,主线程启动个定时器,给UI线程PostThreadMessage(也可以在线程本身里去启动个定时器,然后给线程自身Post消息)UI线程去响应,没有消息的时候UI线程处于空闲状态(idle)不会怎么耗CPU,而且一个UI线程的开销也不怎么大。要退出的时候PostQuitMessage。感觉1L的方法也可以吧,线程中waitforsingleobject一个无信号的内核对象,是不会耗CPU的
      

  6.   

    楼主你的任务是定时读数据,用DOS命令schtasks吧,这个命令可以定时执行一些操作,比如运行程序或BAT文件。这种方式绝对比你用定时器要节省系统资源。
      

  7.   

    主程序关闭的时候,如何通知这个子线程正常退出呢.这个简单啊,用WaitForMultipleObjects
    同时等待一个定时器和主线程,设定为任意一个触发及返回
      

  8.   

    主程序关闭的时候,TerminateThread
      

  9.   

    一般都是用EVENT通知线程退出,比如在线程函数中,大致结构是这样的
    HANDLE hEvent[2] = {0};
    hEvent[0] = ...; // 退出的EVENT
    hEvent[1] = ...; // 做事的EVENT
    BOOL bExitThread = FALSE;
    while(!bExitThread)
    {
     DWORD dwRet = WaitForMultiObjects(hEvent, 2000);
     if(WAIT_FAILED == dwRet)
     {
       // Error, Thread Exit;
       break;
     }
     if(WAIT_TIMEOUT != dwRet)
     {
      switch(dwRet - WAIT_OBJECT_0)
      {
       case 0: // Exit 
         bExitThread = TRUE;
         break;
       case 1:
         // Do something
         break;
       default:
         ASSERT(FALSE);
         break;
      }
     }
    }
      

  10.   


    为什么不用sleep?和watiforsingleobject混蛋前者用于每个隔几秒钟 做一次, 后者用于检测是否退出线程。。
    watiforsingleobject(,0); 立即返回,检测状态。sleep也不会耗cpu
      

  11.   

    楼主,如果你简单的控制WaitForSingleObject完全满足你的需求。
    但是如果需要复杂的控制,多种控制状态,我建议你在自己的线程中建立消息循环 MSG msg;
        while(GetMessage(&msg, NULL, 0, 0))
        {
            if (msg.message == WM_QUIT)
            {
                break;
            }
     
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }然后其他线程用PostThreadMessage来通知该线程。PS:只有计时是伪多线程的,时间一到还是以消息通知UI线程来处理的。很多人误解主要是测试数据工作量太小,看不出来。
      

  12.   

    LZ 咱俩是一样的问题!开始我用的定时器,不停地遍历一个数组里内容进行处理,因为通过客户端--网络可以修改数组;但是会出现跑了一端时间后,就回不到定时器了
    后来用了线程,类似上面的工作;和你一样线程内while,但也有跑出线程的情况;没找到原因呢等专业高手
      

  13.   

    用sleep的话,如果线程刚好在sleep这里,退出指令不响应。想这样用,但有点复杂,想看下有没有简单点的
    同等。
      

  14.   

    拜托,setevetn后,子线程等一会会退出的
      

  15.   

    如果想正常退出子线程,首先可以使用全局变量,但是在创建线程的时候要把线程的句柄保存下来,可以在退出的时候使用watiforsingleobject(handle,10000);等待线程结束,如果是多个句柄可以使用句柄数组WaitForMultipleObjects等待全部结束。
    另外也可以使用start,stop,在stop中实现主动结束线程的操作。
      

  16.   

    用waitforsingleobject来代替Sleep吧,这样简单点。
      

  17.   

    的确需要用到一些事件
    没有更好的办法,
    线程正常工作的时候,使用waitforsingleobject,
    程序关闭的时候,等待线程结束后,才真正关闭.
    只是WaitForMultiObjects这个函数,第二个参数需要的是handle.
    有人可以介绍下用法吗?Cevent Event[];这个是class.
    CEvent [] 到handle []
      

  18.   

    WaitForMultiObjects的用法MSDN有,windows核心编程上也有。可以直接用CreateEvent,保存返回的句柄,如果用CEvent,有个成员变量m_hObject就是句柄,直接转换的应该是木有,一个一个存吧