2013-02-04 55 views
0

我使用基於while(true)和阻塞函數的三個線程創建應用程序模型。C++中的自定義阻止函數

  1. 事件線程 - 等待用戶輸入,阻止SDL_WaitEvent
  2. 停飛螺紋 - 等待來自服務器的數據,已被阻塞插座。
  3. 渲染線程 - 呈現緩衝區中的數據,但未被阻止。

我有一個渲染線程的問題 - 我需要一個阻塞函數,例如,將阻塞,直到某些paint事件(由我定義並在其他兩個線程之一中調度)發生。
但我不知道如何阻止功能的工作。當然,我可以創建一個sleep()循環,但是這樣的循環具有固定的FPS,即使沒有任何事情發生(我已經詳細闡述了該主題here)。在另一方面,它不會立即顯示數據。這對於GUI應用程序並不好。

+1

WaitForMultipleObject有什麼用?它不是你在找什麼? – duDE

+0

看起來不錯。是否有多平臺版本?或者至少,相當於linux,所以我可以自己寫一個? –

+0

'WaitForMultipleObject'是一個黑客,因爲Windows沒有條件變量。當您在等待外部事件(如傳入數據)時非常好,但它不是專爲內部同步而設計的;競爭條件太容易了。 –

回答

2

如果您使用C++ 11,可以使用std::condition_variablestd::mutex

void 
waitForEvent() 
{ 
    std::unique_lock<std::mutex> lock(myMutex); 
    while (! externalCondition) { 
     myConditionVariable.wait(lock); 
    } 
} 

觸發事件:

void 
setEvent() 
{ 
    std::unique_lock<std::mutex> lock(myMutex); 
    setExternalCondition(); 
} 

另你提到一個GUI和一個渲染器。您 不能等待GUI線程中的外部條件。如果 您需要在GUI線程中進行渲染,那麼您必須 瞭解如何在GUI管理器中創建GUI事件,並在GUI事件中發佈 。

+0

好吧,這看起來更好,但我有幾個問題。首先,什麼是'myMutex'變量?那麼在變量定義之後有什麼''。這不是我第一次看到他們。非常相似,我沒有看到'myConditionVariable'的定義。我很抱歉,但我是初學者,我只理解非常基本的語法。 –

+0

'myMutex'和'myConditionVariable'分別是'std :: mutex'和'std :: condition_variable'類型的變量。而'<...>'是模板規範:例如,您每次使用'std :: vector'時都必須看到它們。 –

+0

是的,我已經看過他們的矢量,雖然我不明白他們,但我盡我所能避免矢量。即使'myConditionVariable'和'myMutex'屬於'std :: mutex',它們不會從空中彈出,是嗎?我很抱歉如此煩人,但爲了製作工作代碼,我需要知道在哪裏定義它,或者至少了解整個問題。 –

0

看起來不錯。是否有多平臺版本?或者至少,等價的,所以我可以自己寫一個嗎?

在這個線程看看:WaitForSingleObject and WaitForMultipleObjects equivalent in linux

堅持到那麼pthread_cond_timedwait和使用clock_gettime。例如:

struct timespec ts; 
clock_gettime(CLOCK_REALTIME, &ts); 
ts.tv_sec += 10; // ten seconds 
while (!some_condition && ret == 0) 
    ret = pthread_cond_timedwait(&cond, &mutex, &ts); 
+0

我會嘗試。謝謝。 –

+0

爲什麼要等待? (你可能會顯示mutext的位置和時間。) –