1

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

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

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

这似乎很简单,但正如您所想象的那样,cpu 将达到 100%。如果你想让其他循环运行,主要是为了定时事件。因此,虽然进程可以在最后休眠,但定时事件不能。

我的问题是:收集和处理输入的最佳方式是什么,而不让应用程序占用完整的 CPU 周期?

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

4

2 回答 2

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;
}
于 2013-08-12T09:02:57.400 回答
0

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

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

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

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

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

于 2013-08-12T09:29:11.397 回答