0

QDBusBluetoothプリンターに接続するアプリケーションがあります。プリンターをペアリングした後、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();

これが私ConnectBluetoothPrinter::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;
    }
    ...........
}

ありがとう。

4

0 に答える 0