В Qt вы должны подключить (поставленный в очередь) сигнал, излучаемый вашим потоком, в слот в объекте потока GUI. Вызов слота затем обрабатывается циклом событий, как и спонтанные события, например. пользовательский ввод.
От Maya Posch's excellent article on using QThread:
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)));
Теперь иди и читать How To Really, Truly Use QThreads; The Full Explanation.
Извините, меня интересовало, как различные инструментальные средства _implement_ это поверх XCB, а не как это сделать _with_ API-интерфейсы инструментария. Я хочу сделать это без какого-либо инструментария. Я изменил вопрос, надеюсь, теперь это становится яснее. – cap
А, я вижу. Я напишу для этого другой ответ, но оставьте это здесь, если это полезно будущим читателям. –