RT 举个极端点的例子:
1、线程A
2、线程1,线程2,线程3,线程4,......,线程300 (这里有 1-->300 ,共300个线程)需要做如下事情:
“线程A”每隔 10毫秒,就给“线程1,线程2,线程3,线程4,......,线程300”发通知,“线程1,线程2,线程3,线程4,......,线程300”接到通知就做事情。具体为:
1、“线程A”:10毫秒-->发通知-->10毫秒-->发通知-->10毫秒-->发通知-->......
2、“线程1,线程2,线程3,线程4,......,线程300”:等通知-->通知到、做事情、做完-->等通知-->通知到、做事情、做完-->等通知-->通知到、做事情、做完-->......
我的想法是用人工重置的事件对象:
1、“线程A”:10毫秒-->SetEvent马上ResetEvent -->10毫秒-->SetEvent马上ResetEvent -->10毫秒-->SetEvent马上ResetEvent -->......
2、“线程1,线程2,线程3,线程4,......,线程300”:MsgWaitForMultipleObjects -->做事情,做完-->MsgWaitForMultipleObjects -->做事情,做完-->MsgWaitForMultipleObjects -->做事情,做完-->......我上面用MsgWaitForMultipleObjects是因为还要接收消息,使得某一个线程立马结束。我的要求是效率要高,请问我这个方式可行否?或者有其他效果更好的方式??

解决方案 »

  1.   

    线程1.300做的是一样的任务,还是自己有不同的任务?
    如果是一样的任务,建议使用线程池技术,线程A每10毫秒将任务压入任务队列。然后发一个消息给线程manager,由manager按排空闲的线程去处理任务。如果每个线程处理不同的任务,可以POSTMESSAGE给一个类似线程管理器,由线程管理器根据不同的消息号调用相对应的线程去处理。
      

  2.   

    你这么多线程,要考虑线程Create的开销,最好是一次创建,之后完成任务就挂起,有任务再唤醒。
      

  3.   

    线程池实现会有效率一些,这个问题我记得在侯捷的Win32多线程那本书上提到过
      

  4.   

    to idecl
    创建的事先不管,就当是事先已创建好了。现在就是要让他们同时接到通知,各自干各自不同的事情。我试了下,成功创建了300个线程,再用 “线程A” “SetEvent马上ResetEvent ” ,只有几十个线程接到了通知。
      

  5.   

    当你“SetEvent马上ResetEvent ” 也许程序还来不及通知这么多线程。用PulseEvent 能控制执行一次后立即暂停,这不就达到你的目的了吗
      

  6.   

    sorry,我不知道有这个函数,多谢指教。对于我楼顶的通知方式,有何看法?有何纠正?
      

  7.   

    CreateEvent的第二个参数是false就行了,然后线程里加上ResetEvent就OK
      

  8.   

    如果要隔10毫秒的话,不管线程是否执行完,可以用SetWaitableTimer
      

  9.   

    type
      Tthrdmsg=record
        empty:boolean; 
        msg:integer;
      end;
    //每个工作线程(1-300)有这么一个通知结构
    //empty==true:线程A可以往msg放命令字,放完设为false;
    //empty==false:对应的工作线程可以从msg取得命令字,执行对应的任务,执行完设为true
      

  10.   


    给每一个 工作线程 PostThreadMessage ?这样快吗?我试了下,500个PostThreadMessage有时耗时0毫秒,有时耗时16毫秒,我间隔10毫秒的话,发遍消息都不够啊。
      

  11.   

    看了 一些 线程池 的代码,看到 好像 每个工作线程都配有一个 事件对象,那几百个工作线程 不是要 几百个 事件对象?这么多事件对象 行不行啊? 
    Windows 能支持 最多多少个 事件对象啊?不会是只要资源够,随便多少个吧?