2015-05-19 3 views
2

Мое приложение ждет на поток, чтобы закончить. Когда поток заканчивается, я хочу обновить графический интерфейс. Поток GUI заблокирован в xcb_wait_for_event().Как просыпать поток графического интерфейса в XCB?

Возможно ли это с помощью XCB? Как Qt, GTK, FLTK и т. Д. Реализуют эту основную задачу GUI с точки зрения XCB API?

ответ

0

В 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.

+0

Извините, меня интересовало, как различные инструментальные средства _implement_ это поверх XCB, а не как это сделать _with_ API-интерфейсы инструментария. Я хочу сделать это без какого-либо инструментария. Я изменил вопрос, надеюсь, теперь это становится яснее. – cap

+0

А, я вижу. Я напишу для этого другой ответ, но оставьте это здесь, если это полезно будущим читателям. –

1

Способ, которым он работает в Qt, по-видимому, заключается в том, что xcb_wait_for_event() многократно запускается в потоке. Каждый раз, когда он получает событие, он отправляет сообщение в очередь сообщений общего доступа QApplication. Пользовательские потоки также могут добавлять сообщения в очередь сообщений общего доступа QApplication с помощью сигналов в очереди (см. Мой другой ответ).

Пользовательское приложение теперь может считывать события из очереди общих сообщений (например, используя qApp->exec()) и получать смесь спонтанных событий пользовательского интерфейса и внутренних сигналов от других потоков.

Для получения дополнительной информации, я предлагаю источники Qt5, начиная с src/plugins/platforms/xcb/qxcbconnection.cpp - посмотрите на QXcbEventReader::run.

+0

Спасибо. Кажется, что я реализую свою собственную очередь, и поставить цикл XCB на другой поток - единственный способ пойти (облом). У меня все еще есть слабая надежда на более простое решение, поэтому я собираюсь подождать еще немного ответов. – cap

Смежные вопросы