Мне нужно решить интересную задачу. Я использую Qt 5 для одного из своих проектов для чтения информации в сети. Я читал устройства Modbus и прочее, но настоящая проблема возникает, когда сеть недоступна.
Интерфейс зависает, и я не могу с ним взаимодействовать. Сетевые вещи выполняются в отдельном потоке, или я так думаю. Вот пример кода:
class TwidoDevice : public QObject
{
Q_OBJECT
public:
explicit TwidoDevice
........ And some useful code
Использование класса (основного интерфейса) в Window.cpp
:
L1Thread = new QThread();
L1Thread->start();
L1TWD = new TwidoDevice(L1TWD_settings,
L1TWD_Name,
PercentRegisters,
TotalsRegisters,
db, 1);
L1TWD->moveToThread(L1Thread);
connect(this, SIGNAL(startReading()), L1TWD, SLOT(startFired()), Qt::DirectConnection);
В этом коде startFired()
начните чтение устройств в сети.
В какой-то другой функции в Window.cpp
:
emit startReading()
Когда этот код выполняется, интерфейс зависает, хотя я переместил объект L1TWD
в QThread
.
Когда я пытаюсь его отлаживать с помощью встроенного отладчика в QtCreator, я никак не могу понять, был ли перемещен объект или нет, и почему интерфейс зависает во время сетевого вызова.
Кто-нибудь сталкивался с такой же проблемой и как это решить?
Спасибо, что потратили время на чтение моего вопроса!
connect(this, SIGNAL(startReading()), L1TWD, SLOT(startFired()));
? Пожалуйста, используйте currentThread, чтобы распечатать это, чтобы убедиться, что вы переместились правильно. - person lpapp   schedule 04.12.2014