公式ドキュメントに従って、私はこれをやろうとしています:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QThread *thread = new QThread;
Worker *worker= new Worker();
worker->moveToThread(thread);
//init connections
thread->start();
}
ワーカー コンストラクター:
Worker::Worker(QObject *parent) :
QObject(parent)
{
serial = new QSerialPort(this); //passing the parent, which should be the current thread
}
コンパイル エラーはありませんが、実行すると次のようにスローされます。
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QSerialPort(0x11bd1148), parent's thread is QThread(0x11bd2ef8), current thread is QThread(0x3e47b8)
serial
つまり、私が作成したスレッドではなく、メインスレッドを親として持っていることを教えてくれます。
コンストラクターでシリアルをインスタンス化せず、呼び出した後にトリガーされるメインプロセスで同じ結果になりますthread->start()
。
Worker::Worker(QObject *parent) :
QObject(parent)
{
}
Worker::doWork()
{
if(!serial)
serial= new QSerialPort(this);
//...
}
私は何が欠けていますか?
送信機能の例 (スロット):
void Worker::send(const QByteArray &data)
{
serial->write(data);
if( serial->waitForBytesWritten(TIMEOUT) )
qDebug() << "sent: " << data;
}