マルチスレッドQtアプリケーション(まとめ)
能書き
Qtでマルチスレッドを実現する方法にはいくつかある。
それらの方法や参考となるページをまとめる。
『マルチスレッドとは何か?』
これについては、検索すればいくらでも情報がヒットするので、特筆しない。
個人的には、『処理の流れが複数ある状態』と説明している。
継承を用いて実現する方法
以下のページに詳細を示した。
この方法は、おそらく最も素直な実装スタイルだと思うし、
私が参照したオライリーの入門書でもこれが紹介されていた。
しかし、いくつかの問題点を含むため、次の方法が現在では主流のようだ。
委譲を用いて実装する方法
以下のページに詳細を示した。
参考となるページ
QThread Class | Qt Core 5.8 | Details/QObject 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()スロットを適切に用いれば、クラッシュを回避できる。