2013-08-12 96 views
1

我正在开发一个监控/控制软件,它基本上读取输入(通过网络模块),并在处理它们后生成事件。C#或其他:while循环来更新输入和过程?

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

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

这似乎是非常简单的,但是,你可以想像,CPU将达到100%。 如果你想有其他的循环运行,主要是为了定时事件。 因此,虽然进程最后可能有睡眠,但定时事件不能。

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

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

+0

您如何阅读您的输入? 'Console.ReadXXX'方法不会粉碎CPU .. –

+0

@SimonWhitehead“读取输入(通过网络模块)” - >不是控制台。 –

+0

傻我。我不知道今晚的英语非常好,不幸的是:( –

回答

0

虽然这里不是一个坏主意,但是您有两个问题。
1)CPU最后
2)可能的软件,而读/写

解决的第一个问题只是给一些睡眠目前命悬一线。

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

通过读取与SpinWait.SpinUntil

写我希望这将有助于解决第二个问题。 问候

+1

呃...我认为这可能是采用模型的最佳选择。需要持续更新和处理。当你想让任务更加准确时,为所有任务添加睡眠都是不可用的。 – user2674293

+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; 
} 
+0

是不是定时器回调同步?ieres没有办法它会再次被调用,如果仍然处理。 – Ibasa

+0

@Ibasa:你可能是对的。那,但我不是100%确定 – musefan

+0

@Ibasa:在阅读“备注”部分[这里](http://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed.aspx) ,但并不完全清楚,我认为如果你以某种方式进行配置,你可以采用两种方式,但我不能确定它是默认的那一个,它也建议使用一个标志来避免竞争条件其中一个设置 – musefan