web-dev-qa-db-ja.com

LinuxでcでPThreadをスリープまたは一時停止する方法

マルチスレッドを実行するアプリケーションを開発しています。私のワーカースレッドの1つが、ウィジェットに画像を表示します。別のスレッドがサウンドを再生します。ボタンクリックイベントでスレッドを停止/一時停止/一時停止/スリープしたい。ビデオプレーヤーの再生/一時停止ボタンをクリックしたときと同じです。スレッド化にpthreadライブラリを使用して、Linuxプラットフォーム上のC++でアプリケーションを開発しています。

スレッドの一時停止/一時停止を実現する方法を誰かに教えてもらえますか?

19
Muhammad Ummar

これを行うには、ミューテックス、条件変数、および共有フラグ変数を使用できます。これらがグローバルに定義されていると仮定しましょう。

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int play = 0;

再生コードは次のように構成できます。

for(;;) { /* Playback loop */
    pthread_mutex_lock(&lock);
    while(!play) { /* We're paused */
        pthread_cond_wait(&cond, &lock); /* Wait for play signal */
    }
    pthread_mutex_unlock(&lock);
    /* Continue playback */
}

次に、プレイするには次のようにします。

pthread_mutex_lock(&lock);
play = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);

そして一時停止するには:

pthread_mutex_lock(&lock);
play = 0;
pthread_mutex_unlock(&lock);
29
LnxPrgr3

スレッドにUIからの「メッセージ」を定期的にポーリングさせます。言い換えると、1つのスレッドのUIは、アクションメッセージをワーカースレッドに投稿します。オーディオビデオ。

3
jldupont