我需要一些正确编码的建议:
我正在开发一个使用多个串行连接的程序。每条通信线路都有一个控制器作为抽象层。在控制器和串行端口之间,插入协议以将数据包装在包中,准备传输。该协议负责发送失败,重发等。 为确保GUI不会挂起,每个连接线(协议和串行端口)都在单独的线程上创建。控制器由主线程处理,因为它在GUI中有控件。
目前,当我创建线程时,我选择在它们上创建一个消息循环(Application.Run()),所以改为轮询缓冲区并且如果没有工作则让步,我只是调用线程(BeginInvoke)并使用消息循环作为缓冲区。目前这种方法效果很好,到目前为止还没有出现严重问题。
我现在的问题是:这是“良好的编码”,还是我应该使用while循环而不是轮询缓冲区?或者第三件事?
我想展示代码,但到目前为止它是几千行代码,所以如果您需要查看代码的任何部分,请具体说明。 :)
谢谢。
答案 0 :(得分:4)
在每个线程中使用消息循环是完全正常的; Windows针对此方案进行了优化。您是正确的,以避免轮询,但您可能想要查看其他更高效的基于事件的设计,例如准备传输包并调用SetEvent
以通知其已准备好的线程,或信号量和线程 - 马丁詹姆斯建议的安全队列。
答案 1 :(得分:1)
我不是百分之百确定你在这里做什么,但是,有点“填写”它听起来并不坏:)
当您的应用空闲时(无通信),CPU使用0%?
你的应用程序是否没有睡眠(0)/睡眠(1)或类似的轮询循环?
它是否以合理的低延迟运行?
如果答案是三个'是',你应该没事:)
有一些(非常少的!)情况,其中轮询结果等是一个好主意,(例如,当线程中的事件频率如此之高以至于向GUI发出每个进度事件的信号将会不堪重负它),但大多数情况下,这只是糟糕的设计。