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処理の遅延から保護されますか? (つまり、シリアルオブジェクトとタイマーオブジェクトによって生成されるイベントの生成と処理に遅延はありませんか?)
ありがとう!
私はinvokeMethodを使用する場合は、 "movetothread"の後にコンストラクタ内のタイマーの開始メソッドを呼び出すことができます、ありがとう!これは、ターゲットオブジェクトのスレッドにメソッド呼び出しを「キューイング」します(シグナルスロット相互作用に似ています)?いいよ!前にこの方法を見たことはありません、ありがとう! –