C#或其他:while循环更新输入和进程?

时间:2013-08-12 08:59:32

标签: c# input while-loop

我正在开发一种监控/控制软件,基本上可以读取输入(通过网络模块)并在处理后生成事件。

虽然输入可以依赖于通信速度,并且可以在多线程中运行,但处理基本上是一个连续的循环,基本上:

while (true)
{
    readInputs();
    process();
}

这看起来非常简单但是,正如你可以想象的那样,cpu将达到100%。 如果你想让其他循环运行,主要是为了定时事件。 因此,虽然流程可以在最后进行休眠,但是定时事件可以进行。

我的问题是:在不让应用程序吃掉完整的cpu周期的情况下,收集和处理输入的最佳方法是什么?

更新1: 该应用程序是多线程的,并具有用户界面。 定时器用于更新用户界面(来自共享内存 - 处理的内容和输入状态)。 while循环用于输入读取和处理。

2 个答案:

答案 0 :(得分:2)

在我的选择中,最好的方法是使用计时器并每秒调用这两个函数 - 或者在需要时更频繁地调用它们,但这取决于它们的工作量。

例如:

System.Timers.Timer timer;

void SetupTimer()
{
    timer= new System.Timers.Timer();//create timer
    timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);//attach event handler
    timer.Interval = 1000;//set to fire every 1 second
    timer.Enabled = true;//starts the timer
}

void OnTimedEvent(object source, ElapsedEventArgs e)
{
    DoTasks();
}

void DoTasks()
{
    readInputs();
    process();    
}

您还可以添加isBusy标记,以确保在下一个计时器已过去事件发生时仍在处理任务时,它将不会再次运行它们,当然这取决于您的确切需求。例如:

bool isBusy = false;
void DoTasks()
{
    if(isBusy)
        return;
    isBusy = true;
    readInputs();
    process();    
    isBusy = false;
}

答案 1 :(得分:0)

虽然这不是一个坏主意,但你有两个问题。
1)CPU last 2)在阅读/写作时可能会挂起软件

解决第一个问题只是给当前线程一些睡眠。

while (true)
{
    readInputs();
    Thread.Sleep(300); // more then 100
    process();
}

通过使用SpinWait.SpinUntil读取和写入来解决第二个问题

我希望这会有所帮助。 问候