生成されたスレッドをブーストするにはどうすればよいですか
boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar));
UI インタラクションを取得しますか? boolvar を渡そうとしましたが、応答しません。
生成されたスレッドをブーストするにはどうすればよいですか
boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar));
UI インタラクションを取得しますか? boolvar を渡そうとしましたが、応答しません。
答えは、次のように boost:ref または std::ref を使用することです。
boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boost::ref(boolvar)));
一般に、UI はメイン スレッドで完全に実行する必要があります。(使用している UI ライブラリまたはプラットフォームを指定しませんが、これは事実上すべての主要な GUI に当てはまります)。そのため、作成したスレッド (Boost を使用するかどうかに関係なく) は、GUI と直接やり取りすることはできません。
代わりに、なんらかの形式の通信を使用して、ワーカー スレッドとメイン GUI スレッドとの間でやり取りを行う必要があります。画面の再描画の合図、プログレス バーの更新、テキスト フィールドの変更、ボタンの有効化など、すべての GUI の操作はメイン スレッドで行う必要があります。
開始する簡単な方法は、GUI でワーカー スレッドを生成し、タイマーで定期的にポーリングしてステータスの更新を確認することです (get
スレッドの状態を維持するオブジェクトで適切なメソッドを呼び出すことにより)。次に、ワーカー スレッドは、その状態をアトミックに更新するだけで (つまり、mutex を使用して)、照会できるようになり、GUI について知る必要がなくなります。
渡す は、 へのboolvar
パラメータとして単純に受け取られますMyThreadFunc
。このワーカー スレッド内で、処理ループを提供するか、何らかのシグナルを待機する必要があります。そうしないと、他の関数と同様に完了まで実行され、すぐに戻ります。スレッド関数の最初と最後に or logging 呼び出しを配置するprintf
と、何が起こっているかをよりよく確認できるはずです。
このトピックは明らかに非常に複雑です。より具体的なアドバイスを提供するには、より詳細な情報が必要です。