2017-02-05 12 views
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オブジェクトを操作します。それはここの問題ですか?

+0

[** QObject :: startTimer'](http://doc.qt.io/qt-5/qobject.html#startTimer)のコードは、関連付けられているスレッド以外のスレッドから呼び出されていますおそらく 'QTimer :: start'の呼び出しの結果として、' QObject'自身で実行されます。 'QTimer'をどこでも使っているなら、関連するコードを表示する必要があります。 –

+0

@ G.M。私はQt GUIオブジェクトの1つによって呼び出されるかもしれません。 – PeCosta

+0

タイマーが自分のコードにない場合は、Qtライブラリのデバッグバージョンを取得/ビルドし、警告を発行する行にブレークポイントを設定することをお勧めします(qtbase/src/corelib/kernelの1643行目linux qt5.8ソースの/qobject.cpp)、その時点のバックトレースを見てください。 –

答えて

1

2次プロセスで実行される関数は、どのGUIオブジェクトにも直接アクセスしてはいけません。

これらのオブジェクトのスロットに接続された信号を出力するか、接続タイプQt::QueuedConnectionQMetaObject::invokeMethod()を使用して、GUIオブジェクトメソッド呼び出しをメインスレッドに委譲できます。

関連する問題