使用多个'while()'循环不良做法?

时间:2016-05-16 14:45:49

标签: c# c++ while-loop cpu-usage

我正在编写两个相互协作的应用程序。一个是c ++,另一个是C#。由于涉及流数据,我在多个地方使用代码,例如:

while (true)
{
 //copy streamed data to other places

}

我注意到这些程序使用了大量的cpu,并且响应缓慢。使用这种循环是不好的编程?我应该添加一个:

Sleep(5);

每一个?这有助于cpu的使用吗?

谢谢!

4 个答案:

答案 0 :(得分:5)

通常,在代码中使用Thread.Sleep()也会冻结线程,所以如果您担心的是响应性,则不应该使用它。您应该考虑将流方法移出主(UI)线程

另外,你提到它是一些流媒体流程,所以最佳做法不会像

那样
while(!stream.EndOfStream)
{
//streaming
}

而是使用一些DataReceived事件(如果可用)

答案 1 :(得分:2)

您可能会发现代码的格式更多

while (true)
{
   //WAIT for streamed data to arrive
   //READ data from stream
   //COPY streamed data to other places

   //BREAK when no more data/program is ending


}

这是完全正常的。另一个常见的解决方案是

while (boolean_variable_if_program_is_to_keep_running)
{
   //WAIT for streamed data to arrive
   //READ data from stream
   //COPY streamed data to other places

   //when no more data/program is ending
   //   set boolean_variable_if_program_is_to_keep_running = FALSE


}

答案 2 :(得分:1)

您真正需要避免的(为了您的CPU的健康状况)是让您的程序在while(true)循环中等待数据而不使用系统线程等待函数。

示例1:

while(true) {
   if (thereIsSomeDataToStream) {
       StreamDataFunction();
   }
}

在此示例中,如果thereIsSomeDataToStream一段时间为false,则即使没有要传输的数据,CPU仍将继续100%执行while循环。所以这会浪费CPU并导致计算机速度变慢。

示例2:

while(true) {
   if (thereIsSomeDataToStream) {
       StreamDataFunction();
   }
   else {
       SystemThreadingWaitFunction();
   }
}

相反,在此示例中,当没有更多数据要流时,线程会停止一段时间。操作系统将使用此空闲时间执行其他线程,一段时间后,系统将唤醒您的线程,该线程将恢复并再次循环以传输可能的新数据。然后没有太多的CPU浪费,您的计算机将保持响应。

要执行线程等待过程,您可能有以下几种可能性:

  • 首先,您可以按照建议使用Sleep(t)。这可能会做到 job:编译器提供的睡眠功能在逻辑上会使用 操作系统API到空闲当前线程。但在这种情况下你 即使有些数据出现,也必须等待所有指定的时间 与此同时。因此,如果等待时间太短,CPU将会过度工作,如果 时间太长,你的流媒体会滞后。

  • 或者您可以直接使用操作系统API,我会这样做 推荐。如果您使用的是Microsoft环境,那么有很多 您可以在此处记录等待方法:Microsoft wait functions API。例如,您可以创建一个Event对象 将传入的数据发送到流。您可以发出此事件的信号 代码中的任何位置或其他程序。在while循环中你 然后可以调用像WaitForSingleObject API这样的函数来等待 信号状态的事件。以下是有关如何执行此操作的文档: Using event objects。我不知道linux或其他系统, 但我相信你可以在网上找到它。我自己做过几次, 编码并不难。请享用 ! :)

答案 3 :(得分:0)

这正在扩展我上面的评论,但为了完整起见,我正在粘贴我在这里推荐的内容(并加入其中)。

这类问题的一般解决方案是等待数据的到达并在数据到达时对其进行处理(可能在您处理先前到达的数据时缓存新到达的数据)。至于实施的机制 - 嗯,这取决于一个具体的例子。例如,通常在图形处理应用程序(例如游戏)中,游戏循环"基本上就是你所描述的(没有睡觉)。这在GUI应用程序设计中也会遇到。对于应用程序在处理之前等待事件的设计,请查看典型的网络客户端 - 服务器设计。

至于CPU的减速,请尝试以下代码来观察显着的减速:

while(true);

while(true) sleep(1);

第一个减速的原因是因为在每个循环中,CPU检查循环中的条件是否计算为true(即,在这种情况下,如果true == true)。另一方面,在第二个示例中,CPU检查是否true == true然后为1ms休眠,这比检查true == true所需的时间长得多,从而释放CPU做其他事情。

现在,就您的示例而言,可能处理循环内的数据所需的CPU周期比检查true == true要多得多。因此,添加sleep语句无济于事,但只会使情况恶化。

您应该将它留给内核来决定何时中断您的进程以将CPU周期专用于其他事情。

当然,把我上面写的东西带上一粒盐(特别是最后一段),因为它描绘了一幅非常简单的画面而没有考虑到你的具体情况,这可能会受益于一个设计与另一个设计(我不是&# 39;知道,因为你还没有提供任何细节。