唯一读取消息的方法是调用名为“ReadMessage”的函数,该函数返回从设备读取的一个消息。该函数来自外部DLL,我无法修改它。
我的解决方案:我有一个单独的线程,在程序运行期间始终运行,它的唯一工作就是循环读取消息。然后在主应用程序线程中处理接收到的消息。
在“读取线程”中执行的函数如下:
private void ReadingThreadFunction() {
int cycleCount;
try {
while (this.keepReceivingMessages) {
cycleCount++;
TRxMsg receivedMessage;
ReadMessage(devHandle, out receivedMessage);
//...do something with the message...
}
}
catch {
//... catch exception if reading failed...
}
}
这个解决方案很好用,所有信息都能正确接收。然而,应用程序消耗太多资源,我的电脑CPU运行超过80%。因此,我想减少它。
由于“cycleCount”变量,我知道线程的“循环速度”约为每秒40,000个循环。这是不必要的过多,因为我需要最多接收700条消息/秒(并且设备有大约100条消息的缓冲区,因此循环速度甚至可以稍低)。
我尝试通过Thread.Sleep(1)命令将线程挂起1毫秒来降低循环速度。当然,这行不通,循环速度变成了约70个循环/秒,这不足以读取所有消息。我知道这次尝试很愚蠢,将线程休眠然后再唤醒它所需要的时间远远超过1毫秒。
但是,我不知道还能做些什么:除Thread.Sleep之外,是否有其他方法可以减慢线程执行速度(以减少CPU消耗)?或者我完全错了,应该使用Thread之外的其他东西来完成此任务,例如Threading.Timer或ThreadPool?
非常感谢您提前提供的所有建议。这是我的第一个问题,我是使用线程的初学者,所以请原谅我如果表述不够清晰。