C#或其他:while循环以更新输入和处理
本文关键字:更新 输入 处理 循环 其他 while | 更新日期: 2023-09-27 18:27:22
我正在开发一个监控软件,它基本上读取输入(通过网络模块),并在处理后生成事件。
虽然输入可以取决于通信速度,并且可以在多线程中运行,但处理基本上是一个连续的循环,基本上是:
while (true)
{
readInputs();
process();
}
这看起来很简单,但正如你所能想象的,cpu将达到100%。如果你想让其他循环运行,主要是针对定时事件。因此,虽然进程可以在最后休眠,但定时事件不能。
我的问题是:在不让应用程序占用整个cpu周期的情况下,收集和处理输入的最佳方式是什么?
更新1:该应用程序是多线程的,并且具有用户界面。计时器用于更新用户界面(从共享内存处理的内容和输入状态)。而循环用于输入读取和处理。
在我的选择中,最好的方法是使用计时器并每秒调用这两个函数,如果需要,可以更频繁地调用,但这取决于它们做了多少工作。
例如:
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) CPU最后
2) 读/写时可能软件挂起
要解决第一个问题,只需给当前线程一些睡眠。
while (true)
{
readInputs();
Thread.Sleep(300); // more then 100
process();
}
使用SpinWait.PinUntil 读写来解决第二个问题
我希望这会有所帮助。问候