1

C++ でマルチスレッド コードを記述しようとしていますが、どこにも到達できないようです。私はいくつかの調査を行いましたが、必要なものを達成する方法を示す基本的な例を見つけるのに苦労しています。私はLinuxでGtkアプリケーションに取り組んでおり、ファイルのロードなどの時間のかかる操作があるたびに、GUIがロックされます(移動しようとすると、すべてのコントロールなどが消えて空白のウィンドウが残ります)。これは明らかにスレッド化によって解決できますが、どこから探し始めればよいかわかりません。pthreads、C++ Thread、boost::Thread、Glib::Thread を使用する必要がありますか? 上記のいずれかを使用する違いと理由は何ですか?

私の目的は、バックグラウンドで実行中の操作があるときに表示されるメッセージ ダイアログまたはプログレス バー ダイアログを表示することです。基本的に、物事が行われている間、GUI の応答性を維持するものなら何でも。いくつかの例やソースコードへのリンクを教えていただければ幸いです。

4

6 に答える 6

5

現在は標準のスレッド ライブラリがあるため、コンパイラがサポートしている場合はそれを使用する必要があります。

古いコンパイラに行き詰まっている場合は、Boost.Thread が最適です。これは、標準ライブラリに非常に似ているため、コンパイラを更新するときに変換が簡単になるためです。

ただし、1 つのスレッドに固執し、非同期 I/O を使用してブロックを回避する方がよい場合もあります。

于 2012-04-10T16:17:08.397 に答える
3

GTK を使用する場合、考慮しなければならないことがいくつかあります。GTK はスレッド対応ですが、スレッドセーフではありません。GTK+ のすべての使用を保護する gdk_threads_enter() および gdk_threads_leave() によって制御されるグローバル ロックを提供します。つまり、一度に 1 つのスレッドだけが GTK+ を使用できます。コールバックには少し注意が必要です。GTK+ からのコールバック (シグナル) は、GTK+ ロック内で行われます。ただし、GLib からのコールバック (タイムアウト、IO コールバック、およびアイドル関数) は、GTK+ ロックの外で行われます。したがって、シグナル ハンドラ内では gdk_threads_enter() を呼び出す必要はありませんが、他のタイプのコールバック内では呼び出します。

詳細については、これをお読みください。

http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness

http://www.yolinux.com/TUTORIALS/GTK+ProgrammingTips.html

http://developer.gnome.org/gtk-faq/stable/x481.html

おそらく必要な種類のスレッドは、通常のワーカー スレッドです。作業がバックグラウンドで行われている間、GUI の応答性を維持します。その後、GUI はワーカー スレッドを制御し、タイマーベースのチェックでワーカー スレッドの進行状況を確認し、プログレス バーを更新したり、メッセージ ダイアログを表示したりできます。

ここで、Linux 上の c++ での一般的なマルチスレッドのチュートリアルをいくつか見てください。

http://www.tidytutorials.com/2010/06/linux-c-socket-example-with-client.html

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

http://programming-in-linux.blogspot.jp/2008/03/multithreading-example-in-cc-using.html

于 2012-04-10T16:24:42.997 に答える
2

通常、カーネルとの対話が必要なため、C++ でのスレッド化は、C++11 より前のプラットフォームに依存します (たとえば、pthreads と Windows スレッド)。boost:Thread は、プラットフォームに依存しない方法です (フードの下でプラットフォームに依存するものを実行します) または C++11 にアクセスできる場合は、スレッド化もサポートします (boost::thread に基づく)。

作業しているプラ​​ットフォーム以外のプラットフォームを気にしない場合は、Linux で pthreads を使用し、Windows で通常の win32 スレッドを使用しました。どちらも起動して実行するのは非常に簡単でした。

于 2012-04-10T16:20:57.770 に答える
2

それはあなたが働いている環境に大きく依存します。

可能であれば、標準ライブラリのスレッド化機能を使用してください。これには最新のコンパイラが必要ですが (実際、GCC がそれ実装しているかどうかはまだわかりません)、利用可能な場合はそれを使用してください。

これは非常に優れた API であり、標準的で移植可能です。

私はPOSIXを一種の最後の手段と考えています。これは、*nix システムの最低レベルの共通分母ですが、操作するのに適した API ではありません。あなたが言及する他のすべては、基本的にこれのラッパーです。一方、サードパーティの依存関係を回避します。

私は Glib::Thread を使用したことはありませんが、Glib での私の経験では、それは...ちょっと厄介です。

標準ライブラリ スレッドが利用できない場合、私の好みのライブラリは Boost です。これは非常によく似た API std::thread(後者は Boost.Thread をモデルにしています) であり、非常にうまく機能します。

もちろん、欠点は、サードパーティのライブラリに依存することを意味することです。

于 2012-04-10T16:16:59.890 に答える
1

私はGtkを使ったことがありませんが、GTK +プログラミングのヒントを見ると、GDKスレッドが最も適切なオプションのようです。

于 2012-04-10T16:19:43.793 に答える
0

win32 APIとUNIXの両方について(実行する多くのサンプルコードを使用して)学習するための最良の方法。

WIN32およびUNIXスレッドとセマフォ

于 2012-04-15T04:30:47.210 に答える