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、线程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是因为还要接收消息,使得某一个线程立马结束。我的要求是效率要高,请问我这个方式可行否?或者有其他效果更好的方式??
如果是一样的任务,建议使用线程池技术,线程A每10毫秒将任务压入任务队列。然后发一个消息给线程manager,由manager按排空闲的线程去处理任务。如果每个线程处理不同的任务,可以POSTMESSAGE给一个类似线程管理器,由线程管理器根据不同的消息号调用相对应的线程去处理。
创建的事先不管,就当是事先已创建好了。现在就是要让他们同时接到通知,各自干各自不同的事情。我试了下,成功创建了300个线程,再用 “线程A” “SetEvent马上ResetEvent ” ,只有几十个线程接到了通知。
Tthrdmsg=record
empty:boolean;
msg:integer;
end;
//每个工作线程(1-300)有这么一个通知结构
//empty==true:线程A可以往msg放命令字,放完设为false;
//empty==false:对应的工作线程可以从msg取得命令字,执行对应的任务,执行完设为true
给每一个 工作线程 PostThreadMessage ?这样快吗?我试了下,500个PostThreadMessage有时耗时0毫秒,有时耗时16毫秒,我间隔10毫秒的话,发遍消息都不够啊。
Windows 能支持 最多多少个 事件对象啊?不会是只要资源够,随便多少个吧?