Испускать Qt-сигнал от non Qt Thread или ouside Qt основного цикла событий с 4.5
Я вызываю emit signal1()
из потока без Qt.
С помощью потока non Qt я имею в виду не из цикла событий GUI, а не из любого метода QThread run() или любого собственного цикла событий QThread.
Это просто pthread (pthread_create()), который вызывает метод QObject, который испускает сигналы.
Пример:
MyQbject: public QObject
{
...
void emitBunchOfSignals()
{
emit signal1();
emit signal2();
...
}
...
}
метод "run" моего pthread, который имеет указатель на экземпляр MyObject (экземпляр, который был создан в главном контексте потока QI GUI NOT pthread) вызывает методы emitBunchOfSignals()
.
До Qt 4.5 это было противно. Теперь Qt 4.5 справляется с этим?
Вызывает ли он qApp->PostEvent()
или что-то такое, что сигнал испускается в Qt-графическом потоке (и, следовательно, слот)?
спасибо
Ответы
Ответ 1
Что нужно сделать, так это то, что вы используете связанное по очереди соединение с потоками, так как Qt не может автоматически определить, какой объект принадлежит нитей ( "сродство потока" - это термин, используемый в документации). Вы делаете это при подключении:
connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection);
Это приведет к тому, что сигнал будет помещен в цикле событий адресата, а слот будет вызываться, когда его поток запущен (т.е. его цикл событий).