2013-07-18 2 views
1

У меня есть программа QT, которая получает QBytearray от Kinect, а затем обрабатывает их на видимые изображения на экране в QGLWidget. Этот QGLWidget работает в потоке графического интерфейса пользователя, как и весь графический интерфейс. Класс, который запускает изображения Kinect, запускается в другом потоке. Все comminutation осуществляется через сигналы и слоты.Переместить QGLWidget с помощью только слотов для разного потока

Иногда поток GUI блокируется, а затем OpenGLWidget также блокируется, и я хочу исправить это. Для этого мне нужен слот QT для запуска в другом потоке, а затем в остальном графическом интерфейсе. Я знаю, что это возможно, но все примеры, которые я видел, используют метод run, который запускается в другом потоке, а затем запускается сам по себе.

Но я использую слот для получения изображений, а это значит, что он не работает постоянно, но только если есть изображение, доступное для рендеринга. Могу ли я создать поток и поместить этот слот в поток?

ответ

0

В недавнем проекте я «решил» это shaving some yaks, err, напишите некоторые обертки маршрутизации.

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); 

    /* ... */ 
} 

Позвонив или подключение к общественным слотам внутренней обертки, вызвав InvokeMethod на Qt :: QueuedConnection сделал трюк.

0

Вы можете создать вспомогательный класс и переместить туда свою логику. Таким образом, ваш класс Widget будет в основном потоке, и он должен излучать сигналы, которые будут обрабатываться в вспомогательном классе в другом потоке.

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