0
私は、シリアルポート経由で同時に受信したメッセージを処理しようとしています。それは処理を必要とする各メッセージ用です。私は別のスレッドを使いたいです。QObject :: startTimer:他のスレッドからタイマーを起動できません
これを行うには、receive_Message
が各メッセージで送信される信号に接続されている次のコードを使用します。
void Bat::receivePWrapper(Bat* bat, Message msg){
bat->process_Message(msg);
}
void Bat::receive_Message(Message msg){
QFuture<void> future = QtConcurrent::run(Bat::receivePWrapper,this,msg);
}
明らかに機能しますが、受け取ったメッセージごとにQObject::startTimer: Timers cannot be started from another thread
というメッセージが表示されます。
process_Message
関数は、GUIオブジェクトを操作します。それはここの問題ですか?
[** QObject :: startTimer'](http://doc.qt.io/qt-5/qobject.html#startTimer)のコードは、関連付けられているスレッド以外のスレッドから呼び出されていますおそらく 'QTimer :: start'の呼び出しの結果として、' QObject'自身で実行されます。 'QTimer'をどこでも使っているなら、関連するコードを表示する必要があります。 –
@ G.M。私はQt GUIオブジェクトの1つによって呼び出されるかもしれません。 – PeCosta
タイマーが自分のコードにない場合は、Qtライブラリのデバッグバージョンを取得/ビルドし、警告を発行する行にブレークポイントを設定することをお勧めします(qtbase/src/corelib/kernelの1643行目linux qt5.8ソースの/qobject.cpp)、その時点のバックトレースを見てください。 –