2012-12-23 76 views
2

我使用的是Visual Studio 2012和C++,我需要每5分鐘調用一次函數,我設法做到了,但它消耗了我CPU的25%這遠非理想。用C++調用函數每隔一定的分鐘數

的代碼如下,

time_t start; 
time_t end; 
time(&start); 
while (1) { 
time(&end); 
double dif = difftime (end,start); 
if (dif >= 300) { autofunction(); time(&start);} else {} } 

有沒有更有效的CPU的方式去調用每5分鐘一個函數或任何方式我while循環減慢?

任何指導將不勝感激。

+2

你可以使用'睡眠'功能。 –

+0

我應該提到我不想睡覺,因爲我想同時做其他事情。 – Ryan

+0

@ user1661022在你的if語句的else部分中你做了那些其他的事情? – wimh

回答

2

Windows有Sleep(),對於每300秒發生一次的事情,這是非常好的。在Windows中也有定時器,它可能需要一個timerproc參數,這是一個函數 - 但請注意,這是一個C函數,而不是C++,所以它不能是類成員函數,除非它是靜態函數。

+0

嗯,我認爲在那裏傳遞lambda或'std :: bind'完全正確。 –

+0

是的,只要它不是一個成員函數,任何「可直接作爲函數調用」的東西都可以正常工作。我不想寫一篇關於回調函數的所有限制和技巧的文章,但至少要提到它的存在。 –

0

你在做什麼是busy waiting。您經常檢查時間已過,因此耗盡CPU時間。

既然你是在windows上,Using Timer Queues可能是感興趣的。

這將創建一個具有回調函數的計時器。您可以在等待計時器到期時執行其他工作。

1

由於沒有人提出過,你可以在其中產生一個新的std::threadSleep

0

我認爲最好的答案將取決於你正在做的更多細節。如果你只需要它大約5分鐘,也許你可以把持續時間的計算放在一個更方便編程的位置,並且你會在5分鐘後第一次運行任務。

否則,看起來像@BartekBanachewicz有最好的建議,開始一個線程,它使用sleep ---不阻止你的主線程做你正在做的任何事情。只要你的主線程運行時間肯定超過5分鐘,總是在最後或者在任何時候重新線程都不會成爲問題。

使用線程的好處是不需要任何窗口特定的東西 - 例如, @OlafDietsche的建議,無論定時器隊列是什麼。使用C++ 0x,線程非常易於使用,請參閱:http://en.cppreference.com/w/cpp/thread/thread; http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-1-starting-threads.html