どのように達成するために、マルチスレッドのQt:https://www.cnblogs.com/azbane/p/11372531.html
9月5,2019
思考ガイドを導くために質問して、いくつかの質問を投げるには:
1、QObjectのサブクラスを継承し、QThreadオブジェクトがどのスレッドで作成されましたか?(IE:スレッドQObjectをサブクラスオブジェクトとQThreadのオブジェクトを添付?)
2、QThreadは、どのスレッドで実行されますか?
スレッドが実行3、QObjectを後:: moveToThread(QThread)、QObjectのサブクラスオブジェクトQThread信号(開始/終了)関連機能(スロット機能)?
4、QObjectを:: moveToThread(QThread)、関連するスレッドオブジェクトに取り付けられたスロット関数後(開始/終了)スレッドが実行するQThread信号?
図5に示すように、信号及びスロットの新しいバージョンは、ラムダ式処理信号(QThread(開始/終了)ラムダ関連する信号)の場合に、ラムダオブジェクトがどのオブジェクトで実行しますか?
それはひどいではない、非常に複雑になります。知りたい実行するスレッド内のオブジェクトを、2つの方法があります
1:QThreadは:: currentThreadId()進スレッドID(の#include <QThread>)を返し
2:STD :: this_thread :: GET_ID()進スレッドIDを返します(書式#include <iostreamの>の#include <QThread>)
答えを与える、そして例は、エラー状態が出会いを与えています。
答えは、上位5つの課題を使い果たし:
QObjectのサブクラスのオブジェクトを想定し、QThreadオブジェクトがでスレッドAで作成されます。
1、スレッドA. std :: this_thread :: GET_ID呼び出し
図2に示すように、スレッドA. QThreadを呼び出し:: currentThreadId、我々は進10進から転送され、その後、比較する必要があります。
3、スレッドB. そのスレッドID = Bを仮定 std :: this_thread :: GET_ID呼び出し
4、スレッドA. std :: this_thread :: GET_ID呼び出し
図5に示すように、スレッドB. std :: this_thread :: GET_ID呼び出し
主要な情報の説明の例:
类ShapeLayout:
2人のポインタデータメンバーがあります。GenerateGridFileWork * m_generateGridFileWorkは、QThread * m_generateGridFileWorkThread。
MakeGrid、2人のポインタデータメンバーを作成する関数:関数メンバがあります。
m_generateGridFileWork-> moveToThread(m_generateGridFileWorkThread)。
GenerateGridFileWork :: slotsWork
QThread ::信号は-完成/開始しました
ShapeLayout.h ----------------------------------------------- ------------ クラス ShapeLayout: 公共QObjectを { Q_OBJECTの 公共: ボイドmakeGrid(); 公共スロット: 無効slotsThreadFininshed(); プライベート: GenerateGridFileWork * m_GenerateGridFileWork = nullptr; QThread * m_GenerateGridFileWorkThread = nullptr; } ShapeLayout.cpp ---------------------------------------------- ------------- ボイドShapeLayout :: makeGrid() {
std :: COUT << "ShapeLayoutスレッドIDは" <<はstd :: this_thread :: GET_ID()<<はstd :: COUT。//问题-1 m_GenerateGridFileWork = 新しいGenerateGridFileWork。 m_GenerateGridFileWorkThread = 新しいQThread。 m_GenerateGridFileWork - > moveToThread(m_GenerateGridFileWorkThread)。 QObject ::(m_GenerateGridFileWorkThread、接続&QThread ::始め、m_GenerateGridFileWork、&GenerateGridFileWork :: slotsWorkを)。 QObject ::接続(m_GenerateGridFileWork、&GenerateGridFileWork :: signalsWorkFinished、m_GenerateGridFileWorkThread、&QThread ::終了)。 QObject ::接続(m_GenerateGridFileWorkThread、&QThread ::完成し、この、&ShapeLayout :: slotsThreadFininshed)。 QObjectを::接続(m_GenerateGridFileWorkThread、 &QThreadは::開始、[] { のstd :: COUT << " 接続スレッド開始信号ラムダ対象スレッドIDは、" <<はstd :: this_thread :: GET_ID()<< はstd :: COUT; //问题-5 })。 QObjectを:: m_GenerateGridFileWorkThread、(接続&QThread ::完成し、[] { のstd :: COUT << " スレッドfinishedsignalsを接続ラムダ対象スレッドIDが" <<はstd :: this_thread :: GET_ID()<< はstd :: COUT ; //问题-5
});
std :: COUT << << m_generateGridFileWorkThread-> currentThreadId()<<はstd :: COUT "QThreadスレッドIDは"。//问题-2
m_GenerateGridFileWorkThread->スタート();
}
ボイドShapeLayout :: slotsThreadFininshed()
{
のstd :: coutの<< <<はstd :: this_thread :: GET_ID()<<はstd :: COUT "ShapeLayout起因スレッドIDであるのスロット機能接続"; //问题-4
}を
GenerateGridFileWork.h ----------------------------------------------- - クラス GenerateGridFileWork:公共QObjectを { 公共スロット: ボイドslotsWork(); 信号: 無効signalsWorkFinished(); } GenerateGridFileWork.cpp ---------------------------------------------- - ボイドGenerateGridFileWork :: slotsWork() { のstd :: COUT << " QObjectのサブオブジェクトのスレッドIDのスロット機能に接続される" <<はstd :: this_thread :: GET_ID()<< - //问题; STD :: COUT図3は、 )(signalsWorkFinished発します。 }
ShapeLayout :: makeGrid()を呼び出し、すべて知っている、自分のそれを再度実行します
大丈夫完璧...