1

我有一个 QT 程序,它从 Kinect 接收 QBytearray,然后将它们处理为 QGLWidget 中屏幕上的可见图像。这个 QGLWidget 在 GUI 线程中运行,就像 GUI 的其余部分一样。触发 Kinect 图像的类在不同的线程中运行。所有粉碎都是通过信号和槽完成的。

有时 GUI 线程锁定,然后 OpenGLWidget 也锁定,我想修复它。为此,我需要一个 QT Slot 在与 GUI 的其余部分不同的线程中运行。我知道这是可能的,但我看到的所有示例都使用 run 方法,该方法在不同的线程中启动,然后自行运行。

但是我使用一个插槽来接收图像,这意味着它不会一直运行,但只有在有图像可用于渲染的情况下才会运行。我可以创建一个线程并将这个插槽放入线程中吗?

4

2 回答 2

0

您可以创建助手类并将您的逻辑移到那里。因此,您的 Widget 类将位于主线程中,并且它应该发出信号,这些信号将在不同线程的辅助类中进行处理。

于 2013-07-18T11:38:52.280 回答
0

在最近的一个项目中,我通过刮掉一些牦牛“解决”了这个问题,错误,编写了一些路由包装器。

class FooClass : public QThread
{
Q_OBJECT

  /* ... */

public slots:
/* to thread loopback signals */
void setBufferCount(
    unsigned int buffercount ) {
        QMetaObject::invokeMethod(this, "_priv_loslot_setBufferCount",
            Qt::QueuedConnection,
            Q_ARG(unsigned int, buffercount) ); 
    }

private slots:
/*
 * private loopback slots
 * ^^^^    ^^       ^^^^
 *
 * These slots are connected to the coresponding frontend
 * signals. Calling a frontend signal will send a invocation
 * between the threads, calling the loopback slots within
 * the worker thread.
 */
void _priv_loslot_setBufferCount(unsigned int buffercount);

  /* ... */
}

通过调用或连接到公共插槽,通过调用Qt::QueuedConnection上的invokeMethod进行内部包装就可以了。

于 2013-07-18T13:44:30.907 回答