У меня есть класс, полученный из QThread
: class MyClass : public QThread
Этот класс связан со слотом другого объекта. Первоначально это было связано как Qt::AutoConnection
, Но потом — как только поток запустится (MyClass::run()
) — сигнал больше не «достигает слота» (Зачем?).
// connected before myObject->run()
s = QObject::connect(
_myObject, SIGNAL(signalLogMessage(const QString&, QtMsgType)),
this, SLOT(slotLogMessage(const QString&, QtMsgType)), Qt::DirectConnection);
Моя первая идея заключалась в том, что мне нужно заставить Qt::QueuedConnection
(this
/ _myObject
будет перекрестной резьбой). В этом случае это не работает вообще. Только Qt::DirectConnection
работает. После запуска темы ИМХО Qt::QueuedConnection
это правильный выбор (поперечная нить).
Есть идеи, что не так? Само соединение кажется правильным, иначе оно не работало (значит, даже не с Qt::DirectConnection
).
Редактировать 1: — По состоянию на ответ Хайда / Комментарий Никоса
На данный момент я думаю, что ответ Хайда / комментарий Никоса указывают на основную причину. мой QThread
запускает свой собственный цикл сообщений для другого приложения. Это причина, по которой он работает в своем собственном потоке и представляет собой бесконечный цикл.
run() {
// exec(); // while not reached
while (_runMessageLoop && ...) {
hr = CallDispatch(.....);
if (hr== 0) QThread::msleep(100);
// QCoreApplication::processEvents();
}
}
Думаю, из-за этого бесконечного цикла цикл сообщений Qt не работает, и сигнал / слоты не обрабатываются (это правильно?) При форсировании Qt::DirectConnection
методы вызываются напрямую без необходимости в цикле сообщений Qt, это может быть причиной того, что это единственный работающий тип соединения.
Вопрос в том, как я могу объединить Qt и мой собственный цикл сообщений (если это возможно)? Невозможно вызвать exec () перед циклом (потому что тогда он находится в цикле Qt), и только QCoreApplication::processEvents();
в «моем цикле» все еще не работает.
=> см новый вопрос здесь: Как совместить собственный цикл сообщений и цикл событий Qt?
Трудно сказать, не видя весь код, но это может быть из-за этого:
Сам объект QThread — это не поток, а контроллер потока. Что наиболее важно, сродство потока объекта QThread должно не быть нитью, которой он управляет. Если ваш поток запускает цикл событий Qt, то лучше избегать создания подкласса QThread. Вместо этого поместите свою логику (слоты между потоками и т. Д.) В другой объект QObject, который вы перемещаете в поток, созданный с помощью moveToThread после его создания. Единственная реальная причина для создания подкласса QThread — переопределение run()
метод с тем, который не вызывает exec()
,
Связанное чтение:
http://blog.qt.digia.com/2010/06/17/youre-doing-it-wrong/
Вдобавок:
Если вы переопределите QThread :: run (), вы должны вызвать QThread::exec()
там или цикл обработки событий не будет запущен, и никакой непрямой сигнал не будет доставлен ни одному объекту QObject с этим сродством потока. Если вы хотите иметь свой собственный цикл обработки событий, это возможно, вам просто нужно позвонить QCoreApplication::processEvents()
обрабатывать события Qt.
Других решений пока нет …