マルチスレッドを実現するためにmoveToThread方法を使用してQThread。、関連するスロットの機能を接続する、それ自体スレッド関連ラムダオブジェクトがどのスレッドで実行された接続。

どのように達成するために、マルチスレッドの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_ge​​nerateGridFileWorkは、QThread * m_ge​​nerateGridFileWorkThread。

      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()を呼び出し、すべて知っている、自分のそれを再度実行します

大丈夫完璧...

 

おすすめ

転載: www.cnblogs.com/azbane/p/11465466.html