2013-08-12 30 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