我有许多线程(100 个),每个线程一次执行几秒钟。当它们执行时,它们花费大量时间等待来自另一个系统(串行设备)的响应。我注意到一次执行 100 个线程可能会占用资源,因此我实际上限制了可以在任何时候启动的线程数。
尽管在我看来,在线程内等待外部事件必须有好的和坏的方法。这种方法是 CPU 密集型的吗?:
send command ;
repeat
until response arrived ;
process response ;
这种方法是否使它更有效?:
send command ;
repeat
Sleep (20) ;
until response arrived ;
process response ;
* 附加信息 *
环境是 x86 Windows XP。线程代码是与串行设备进行的一系列冗长且复杂的交互,但一般来说,它包括将字符写入 COM 端口(使用 AsyncFree 串行库)并通过驻留在传入字符缓冲区等待字符返回,以及当它们到达时处理它们。我想串行库使设备读写。线程中的时间可以长到一分钟,也可以短到几秒,但大部分时间都花在等待字符离开端口,或者等待响应字符(波特率很慢),因此我的问题是线程在等待时的最佳行为方式。目前我正在Sleep
循环等待CharactersInBuffer
变为非零,在每个字符到达时处理它,并在我有完整响应时退出线程。所以代码看起来更像(忽略超时处理等):
send command ;
Packet = '' ;
repeat
repeat
Sleep (20) ;
until response character arrived ;
build Packet
until complete packet arrived
process response ;