2017-12-07 25 views
0

GUI処理遅延から切り離された状態に保つため、別のスレッドに割り当てられた「自己完結型」通信オブジェクトを作成しようとしています。QT QTimerとQSerialを使用したQThread - 子育て

ので、 "AppCore" オブジェクトの作成に私が親なしで一つの "CommCore" を作成します。

cAppCore::cAppCore(QObject *parent) : QObject(parent) 
{ 
    .... 
    CommCore = new cCommCore; 
    (here I do signal-slot connections between CommCore and AppCore) 
    .... 
} 

とCommCoreコンストラクタで、私は次の操作を行います

cCommCore::cCommCore(QObject *parent) : QObject(parent) 
{ 
    CommThread = new QThread(this); 
    CommSerial = new QSerialPort(this); 
    CommTimer = new QTimer(this); 

    connect(CommSerial,&QSerialPort::readyRead,this,&cCommCore::ProcessRXByte); 
    connect(CommSerial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &cCommCore::HandleSerialError); 
    connect(CommTimer, &QTimer::timeout, this,&cCommCore::TimerTimeout); 

    CommTimer->start(OFFLINE_POLL_TIME); 
    this->moveToThread(CommThread); 
    CommThread->start(QThread::HighPriority); 
} 

今私の質問:

1-スレッドハンドラオブジェクトを移動オブジェクトの子にするのは問題ありませんか? GUIスレッド(コンストラクターが呼び出されている場所)で作成され、それ自体で処理されるスレッドに移動されます(CommCoreオブジェクトの内部から処理する必要がある場合)。

2コンストラクタ(タイマーコンストラクタの同じスレッド、GUIスレッド)にタイマーを開始して、新しいスレッドにすべてを移動した直後にはどうですか?

3-私がタイマーを後で開始したいのであれば、唯一の方法はシグナルスロットを通すことでしょうか?ここで、CommCoreオブジェクトとAppCore(GUIスレッド)との間のすべてのやり取りは、シグナルスロット(スレッドセーフである)を介して作られた、それは概念的に正しいですか?

5私のシリアル通信ルーチンは(タイマーによってタイムドされます)GUI処理の遅延から保護されますか? (つまり、シリアルオブジェクトとタイマーオブジェクトによって生成されるイベントの生成と処理に遅延はありませんか?)

ありがとう!

答えて

2
this->moveToThread(CommThread); 

は、オブジェクトに親がない場合に成功します。したがって、コンストラクタのシグネチャを変更する必要があります。それ以外のオブジェクトはその子と一緒に動かされるので、それは大丈夫です...

タイマーは、別のスレッドに移動されるので、このように開始すべきではありません。 invokeMethodを使用して、操作を実行する正しいスレッドにする必要があります。

QMetaObject::invokeMethod(CommTimer, "start"); 

その他の質問については、すべての回答がyesです。シグナルを使用し、invokeMethodを使って呼び出す限り、それはスレッドが実行可能なプールからフェッチして実行しているかのようです。

スレッドは安全であり、メインスレッドの中断の影響を受けません。

+0

私はinvokeMethodを使用する場合は、 "movetothread"の後にコンストラクタ内のタイマーの開始メソッドを呼び出すことができます、ありがとう!これは、ターゲットオブジェクトのスレッドにメソッド呼び出しを「キューイング」します(シグナルスロット相互作用に似ています)?いいよ!前にこの方法を見たことはありません、ありがとう! –

関連する問題