Название: Циклический(бесконечный) опрос QTcpSocket в потоке QThread Отправлено: calipsofirst от Февраль 27, 2012, 08:49 Есть гуи приложение, из которого создается класс Sock, который в свою очередь наследует QThread. Соответственно, класс Sock имеет виртуальный метод run, в котором создается экземпляр QTcpSocket и соединяются сигналы данного экземпляра со слотами класса Sock (connected, disconnected, readyRead) и потом происходит запрос соединения(connectToHost). Затем должен начаться циклический опрос данных с удаленного устройства. Но есть проблема: если зацыклить здесь опрос, но не запускается метод exec(), указаный в конце тела run(). Ну и понятно, что без exec() не работает event loop и не работает не одно событие... даже как таковая отправка данных по QTcpSocket->write(). Но если дать запуститься методу exec(), то я не понимаю где тогда запускать циклический опрос данных. Пробовал запускать циклический опрос из слота connected(), предполагая, что через этот слот опрос будет выполняться "параллельно" методу exec(), но в этом случает "виснет" главное окно, как будто опрос происходит в основном потоке (хотя по соединению сигнал-слот должен вызываться из потока). Метод moveToThread никакого эффекта не дает. В общем, прощу помощи найти рабочее решение для организации циклического опроса в потоке. Перечитал много веток на этом форуме и на других, но не смог найти в них что то полезное, к тому же большинство топиков посвящено созданию сервера в потоке. Для тестирования создал небольшой проект, его здесь и приведу:
MainWindow.cpp Код: MainWindow::MainWindow(QWidget *parent) : sock.h Код: #include <QThread> sock.cpp Код: #include "QtNetwork" Название: Re: Циклический(бесконечный) опрос QTcpSocket в потоке QThread Отправлено: calipsofirst от Февраль 27, 2012, 08:53 Забыл указать версии: Qt 4.8.0, mingw32 4.4.0, winxp xp3, qt creator 2.4.1. Все действие происходит в виртуалке vmware player. Но на хосте debian testing все тоже самое.
Название: Re: Циклический(бесконечный) опрос QTcpSocket в потоке QThread Отправлено: LisandreL от Февраль 27, 2012, 10:37 Sock хоть и является потоком сам живёт в основном потоке, соответственно его слоты будут выполняться в основной гуй потоке.
Название: Re: Циклический(бесконечный) опрос QTcpSocket в потоке QThread Отправлено: calipsofirst от Февраль 27, 2012, 19:46 Хм.. странно, ведь сокет создается в потоке... Но как бы то ни было, проблему я решил, поставив в цикле (requestLoop) QEventLoop с методом processEvents() таким образом:
Код: void Sock::requestLoop() Название: Re: Циклический(бесконечный) опрос QTcpSocket в потоке QThread Отправлено: Alatey от Май 31, 2012, 18:04 Здесь про exec() http://www.devdoc.ru/index.php/content/view/qt_threads.htm
По-моему exec() запускается что-бы поток обрабатывал свои слоты. А если читать данные в бесконечном цикле то ставишь этот цикл в run(), а exec() - ненужен. |