アプリがスレッドの終了を待機しています。スレッドが終了したら、GUI を更新したいと思います。GUI スレッドは xcb_wait_for_event() でブロックされます。
これはXCBで可能ですか?Qt、GTK、FLTK などは、この基本的な GUI の問題を XCB API に関してどのように実装していますか?
Qt では、スレッドによって発行された (キューに入れられた) シグナルを GUI スレッド オブジェクトのスロットに接続する必要があります。スロット呼び出しは、ユーザー入力などからの自発的なイベントと同様に、イベント ループによって処理されます。
QThread の使用に関する Maya Posch の優れた記事から:
class Worker : public QObject {
Q_OBJECT
public:
Worker();
~Worker();
public slots:
void process();
signals:
void finished();
void error(QString err);
private:
// add your variables here
};
void Worker::process() {
// allocate resources using new here
qDebug("Hello World!");
emit finished();
}
GUI スレッドで:
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
connect(thread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
気になるラインは
connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
QThreads を実際に、本当に使用する方法を読んでください。完全な説明。
Qt での動作方法xcb_wait_for_event()
は、独自のスレッドで繰り返し実行されるようです。イベントを受信するたびに、QApplication
の共有メッセージ キューにメッセージをポストします。ユーザースレッドはQApplication
、キューに入れられたシグナルを使用して、の共有メッセージキューにメッセージを追加することもできます(私の他の回答を参照)。
ユーザー アプリケーションは、共有メッセージ キューからイベントを読み取り (例: を使用qApp->exec()
)、自発的な UI イベントと他のスレッドからの内部信号の混合を受信できるようになりました。
詳細については、Qt5 のソースをお勧めしsrc/plugins/platforms/xcb/qxcbconnection.cpp
ますQXcbEventReader::run
。