需要のないページ

プログラミングや趣味や。

マルチスレッドQtアプリケーション(まとめ)

能書き

Qtでマルチスレッドを実現する方法にはいくつかある。

それらの方法や参考となるページをまとめる。

 

『マルチスレッドとは何か?』

これについては、検索すればいくらでも情報がヒットするので、特筆しない。

個人的には、『処理の流れが複数ある状態』と説明している。

 

継承を用いて実現する方法

以下のページに詳細を示した。

この方法は、おそらく最も素直な実装スタイルだと思うし、

私が参照したオライリーの入門書でもこれが紹介されていた。

 

しかし、いくつかの問題点を含むため、次の方法が現在では主流のようだ。

 

委譲を用いて実装する方法

以下のページに詳細を示した。

 

参考となるページ

QThread Class | Qt Core 5.8 | DetailsQObject Class | Qt Core 5.8 | moveToThread()

まずは公式リファレンス×2。

それぞれのページで、Qtのスレッドの扱いについて知見を深められる。

また、継承による方法、委譲による方法の両方のコードが紹介されている。

Qtでスレッドを使う前に知っておこう - Qiita

この中で唯一日本語のページ。

なぜ継承による実装が避けられるのか、その問題点を列挙している。

また、connect関数の第5引数に関しても詳説があり、非常に参考になる。

How To Really, Truly Use QThreads; The Full Explanation | Maya's Programming & Electronics Blog

委譲による方法を提言し、Qt公式リファレンスに強い影響を与えたエントリー。

従来の方法を批判する要点は次のとおり(稚拙な和訳/強引な意訳)。

  • 継承による従来の方法は、必要以上に複雑で不適当。
  • QThreadは、『スレッド』そのものではない。スレッド周辺を覆うラッパークラスだ。したがって、サブクラスがスレッドのように扱われるのは不適当。

具体的に実装する際の主な注意点は次のとおり(稚拙な和訳/強引な意訳)。

  • 別スレッドで動かすQObjectのコンストラクタでヒープ領域を確保しないこと。QObjectをインスタンス化したときは、まだ旧スレッド上にある。
  • deleteLater()スロットを適切に用いれば、クラッシュを回避できる。
/* コードブロック */