2011-04-19 101 views
1

我有一個線程,其任務是發送消息到UDP對等體。如果滿足以下條件之一,則線程發送消息:等待時間通過,而不忙在C窗口等待

1)自上次發送消息(例如超時)以來已過去了一段時間。

2)共享結構中的更新布爾標誌已被其他線程引發。

我希望能夠等待這些情況發生,所以我會知道何時發送消息。

我可以做到的最簡單的方法是製作一個循環,直到其中一個條件滿足爲止。我擔心它正在忙着等待,並且會耗費大量的CPU時間。我也不想使用sleep()。

只要易於理解和實現,我不介意使用C++解決方案,因爲我對C++不是很熟悉。

謝謝!

回答

10

對於windows,使用事件(CreateEvent)而不是bool,然後使用WaitForSingleObject就可以了。

+0

,是以第2條件的照顧,我會與事件替換它。對於第一種情況,我如何等待時間通過窗口? – Michael 2011-04-19 12:56:27

+1

@michael:用WaitForSingleObject - 傳遞幾毫秒。當*事件被髮信號或等待超時時它會返回。 – Erik 2011-04-19 12:57:03

+0

我看到了,沒有意識到這一點。正是我需要的,謝謝你! – Michael 2011-04-19 13:00:49

2

對於線程之間的信號,我同意Erik。使用事件對象。

對於超時問題,您可以使用CreateWaitableTimer()和SetWaitableTimer()

要等待線程中的事件發出信號或計時器耗盡,可以使用wait函數WaitForMultipleObjects()。您可以傳遞一系列句柄(=處理事件和處理計時器),等待它們獲取信號。

等待功能沒有使用了CPU,就像一個輪詢循環,因爲等待是在內核級處理,而它正在等待一個對象來獲得信號的線程被掛起會做的優勢。

0

您很可能想要使用線程中嵌入的回調例程。有關說明,請參閱What is a 「callback」 in C and how are they implemented?,並查看此wiki的example中的C示例,該示例將回調函數作爲函數指針進行實​​現。使用某種類型的事件框架(如Erik等人所建議的)比使用自己的方法更容易,但是這是一個方便的技巧。

+1

Hangon ....他需要等待一個信號*或*一個超時,有一個API調用完全可以*,但他應該用更復雜的機制來做到這一點? – Erik 2011-04-19 13:04:12

+0

@Erik - 對你來說+1:正如我所說的,......使用某種類型的事件框架(如Erik等人所建議的)比使用自己的方法更容易,但這是一種方便的技巧你的詭計。之前必須做過一次(順便說一句,在C中)對於我更好地理解事件處理在現實世界中的完成方式非常有幫助。只是指出一個「可教授的時刻」... – Marc 2011-04-19 13:10:44

0

我會使用WaitForMultipleObjects,偵聽2個事件 第一個將退出該線程,第二個將執行該工作。

事情是這樣的......

DWROD dwTimeOut = .....; 


DWORD dwRetValue = WaitForMultipleObjects(2, hEvents, false, dwTimeOut); 

if((dwRetValue == WAIT_TIMEOUT) || (dwRetValue == (WAIT_OBJECT_0 + 1))) 
{ 
    // Do Work 

} 
else if(dwRetValue == WAIT_OBJECT_0) 
{ 
    // End Thread 

} 
else 
{ 
    // Deal with Error 
}