QDBus
Bluetoothプリンターに接続するアプリケーションがあります。プリンターをペアリングした後、Connect
インターフェイスを呼び出しorg.bluez.Serial
ます。呼び出しが戻るまで、これが実際に UI をフリーズしていることに気付きました。ワーカー オブジェクトを作成してから別のオブジェクトに移動しましたがQThread
、問題も解決しませんでした。
Worker* w = new Worker();
QThread* thread = new QThread();
w->moveToThread(thread);
connect(thread, &QThread::started, w, &BluetoothPrinter::Worker::print);
connect(w, &BluetoothPrinter::Worker::finished, thread, &QThread::quit);
connect(w, &BluetoothPrinter::Worker::finished, w, &BluetoothPrinter::Worker::deleteLater);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
connect(w, &BluetoothPrinter::Worker::destroyed, []() { qDebug() << "worker destroyed"; });
connect(thread, &QThread::destroyed, []() { qDebug() << "thread destroyed"; });
thread->start();
これが私Connect
がBluetoothPrinter::Worker::print
関数を呼び出す方法です。
QDBusInterface dbusSerialInterface("org.bluez", objPath, "org.bluez.Serial", QDBusConnection::systemBus(), this);
if (dbusSerialInterface.isValid()) {
QDBusMessage reply = dbusSerialInterface.call("Connect", "spp"); // freezes UI here
if (reply.type() == QDBusMessage::ErrorMessage || reply.arguments().isEmpty()) {
emit finished();
return;
}
...........
}
ありがとう。