2012-12-21 47 views
9

德爾福XE2文件說,這大約TEvent:您如何檢測到TEvent已設置?

有時候,你需要等待線程完成一些操作,而不是等待特定線程來完成執行。爲此,請使用事件對象。應該使用全局作用域創建事件對象(System.SyncObjs.TEvent),以便它們可以像所有線程都可見的信號那樣工作。

當線程完成其他線程所依賴的操作時,它會調用TEvent.SetEvent。 SetEvent打開信號,所以其他任何檢查線程都會知道操作已完成。要關閉信號,請使用ResetEvent方法。

例如,考慮一種情況,您必須等待幾個線程才能完成其執行,而不是單個線程。因爲你不知道最後哪個線程會完成,所以你不能簡單地使用其中一個線程的WaitFor方法。相反,你可以讓每個線程在完成時增加一個計數器,並且通過設置一個事件來獲得最後的線程信號。

但是,Delphi文檔沒有解釋另一個線程如何檢測到TEvent.Set事件被調用。你能否介紹一下如何檢查TEvent.Set是否被調用?

+2

爲什麼你不等待所有的線程/事件發出信號?爲什麼要測試而不是等待? –

+0

謝謝您的評論。爲了迴應我在這裏收到的幫助,我實際上已經編寫了代碼以等待事件發出信號。 –

回答

11

如果要測試是否發出事件,請調用WaitFor方法並將超時值設置爲0.如果設置了該事件,它將返回wrSignaled。如果不是,它會立即超時並返回wrTimeout

話雖如此,事件的正常用法不是檢查它是否以這種方式發送信號,而是通過阻塞當前線程進行同步,直到事件發出信號。您可以通過將非零值傳遞給timeout參數來完成此操作,如果您確定它會完成並且您想要等待直到它結束,則返回常量INFINITE;如果您不想爲無限期多少時間。

+0

通常'WaitFor'用於無限或小但非零超時。 – kludg

+2

@Serg:True。但在這種特定情況下,只是想檢查是否設置,也可以這樣使用。 –