我正在开发一种监控/控制软件,基本上可以读取输入(通过网络模块)并在处理后生成事件。
虽然输入可以依赖于通信速度,并且可以在多线程中运行,但处理基本上是一个连续的循环,基本上:
while (true)
{
readInputs();
process();
}
这看起来非常简单但是,正如你可以想象的那样,cpu将达到100%。 如果你想让其他循环运行,主要是为了定时事件。 因此,虽然流程可以在最后进行休眠,但是定时事件可以进行。
我的问题是:在不让应用程序吃掉完整的cpu周期的情况下,收集和处理输入的最佳方法是什么?
更新1: 该应用程序是多线程的,并具有用户界面。 定时器用于更新用户界面(来自共享内存 - 处理的内容和输入状态)。 while循环用于输入读取和处理。
答案 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读取和写入来解决第二个问题
我希望这会有所帮助。 问候