如何在XCB中唤醒GUI线程?

时间:2015-05-19 10:41:20

标签: qt gtk x11 xlib xcb

我的应用正在等待线程完成。当线程完成它的东西时,我想更新GUI。 GUI线程在xcb_wait_for_event()中被阻止。

这可能与XCB有关吗? Qt,GTK,FLTK等如何在XCB API方面实现这个基本的GUI问题?

3 个答案:

答案 0 :(得分:1)

在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

答案 1 :(得分:1)

它在Qt中的工作方式似乎是xcb_wait_for_event()在自己的线程中重复运行。每次收到事件时,它都会在QApplication的共享消息队列上发布消息。用户线程也可以通过排队信号向QApplication的共享消息队列添加消息(参见我的其他答案)。

用户应用程序现在可以从共享消息队列中读取事件(例如,使用qApp->exec())并接收自发UI事件和来自其他线程的内部信号的混合。

如需更多阅读,我建议使用src/plugins/platforms/xcb/qxcbconnection.cpp开头的Qt5来源 - 查看QXcbEventReader::run

答案 2 :(得分:0)

stackoverflow.com/questions/8794089/how-to-send-key-event-to-application-using-xcb

注意潜在安全性的警告方法,以及使用xtest避免它的方法。我想知道你是否宁愿等待信号?他们看起来并不那么恐怖和神秘。 Michael Kerrisk写了一本很棒的书:Linux编程接口Linux和UNIX系统编程手册,它解释了它。