10

我需要一些正确编码的建议:

我正在开发一个使用多个串行连接的程序。每条通信线路都有一个控制器作为抽象层。在控制器和串行端口之间,插入协议以将数据包装在数据包中,以备传输。该协议负责处理失败的交付、重新发送等。为了确保 GUI 不会挂起,每个连接线(协议和串行端口)都在单独的线程上创建。控制器由主线程处理,因为它在 GUI 中有控件。

目前,当我创建线程时,我选择在它们上创建一个消息循环(Application.Run()),所以如果没有工作,我只是调用线程(BeginInvoke)并使用消息循环而不是轮询缓冲区并产生一个缓冲区。这目前工作得很好,到目前为止还没有严重的问题。

我现在的问题是:这是“良好的编码”,还是我应该在胎面上使用 while 循环并轮询缓冲区?还是第三件事?

我想展示代码,但到目前为止它是几千行代码,所以如果您需要查看代码的任何部分,请具体说明。:)

谢谢你。

4

2 回答 2

4

在每个线程中使用消息循环非常好;Windows 针对这种情况进行了优化。避免轮询是对的,但您可能想研究其他更有效的基于事件的设计,例如准备一个包以进行传输并调用SetEvent以通知线程它已准备好,或者像 Martin 一样的信号量和线程安全队列詹姆斯建议。

于 2012-07-25T08:21:49.987 回答
1

我不是 100% 确定你在这里做什么,但是,有点“填写”听起来不错:)

当您的应用程序处于空闲状态(无通信)时,CPU 使用率是否为 0%?

您的应用程序是否没有 sleep(0)/sleep(1) 或类似的轮询循环?

它是否以相当低的延迟运行?

如果答案是三个“是”,你应该没问题:)

在少数情况下(非常少!),轮询结果等是一个好主意,(例如,当线程中的事件频率如此之高以至于向 GUI 发送每个进度事件的信号时会压倒它),但大多数情况下,这只是糟糕的设计。

于 2012-07-25T08:16:50.230 回答