LINUX.ORG.RU

История изменений

Исправление quiet_readonly, (текущая версия) :

Нужно создать сигнал для момента, когда данные будут готовы, и в момент готовности делать emit; также надо сделать слот, который обрабатывает готовые данные. В конце обработки выпускать сигнал, который будет соединён с QApplication::quit.

QEventLoop не нужен, QApplication::exec() сам по себе будет выполняться, пока не будет вызван слот quit. Тут пример минимального консольного приложения, без асинхронности, но для добавления асинхронности достаточно добавить сигналы/слоты и ловить сигнал от QTcpSocket, чтобы затем выпустить уже свой сигнал, назвав его, к примеру, dataReady().

P.S. Добавлю, что в Qt сигналы и слоты — это потокобезопасная реализация паттерна Observer. Сигнал означает событие, с помощью метода QObject::connect можно соединить событие с обработчиком — «слотом». При этом на одном событии может быть сколько угодно слотов. При уничтожении одного из объектов или явном вызове QObject::disconnect связь сигнала и слота разрывается.

О многопоточности: каждый слот будет вызываться в том потоке, где находится объект, в классе которого объявлен слот; объект по дефолту находится в том потоке, где был вызван конструктор класса (но можно переместить объект в рантайме). Если объект сигнала и объект со слотом находятся в одном потоке, то вызов будет мгновенный и строчка «emit mySignal()» не вернёт управление, пока слот не выполнится; иначе будет асинхронный вызов с состоянием гонки.

Исправление quiet_readonly, :

Нужно создать сигнал для момента, когда данные будут готовы, и в момент готовности делать emit; также надо сделать слот, который обрабатывает готовые данные. В конце обработки выпускать сигнал, который будет соединён с QApplication::quit.

QEventLoop не нужен, QApplication::exec() сам по себе будет выполняться, пока не будет вызван слот quit. Тут пример минимального консольного приложения, без асинхронности, но для добавления асинхронности достаточно добавить сигналы/слоты и ловить сигнал от QTcpSocket, чтобы затем выпустить уже свой сигнал, назвав его, к примеру, dataReady().

Исправление quiet_readonly, :

Нужно создать сигнал для момента, когда данные будут готовы, и в момент готовности делать emit; также надо сделать слот, который обрабатывает готовые данные. По готовности выпускать сигнал, который будет соединён с QApplication::quit.

QEventLoop не нужен, QApplication::exec() сам по себе будет выполняться, пока не будет вызван слот quit. Тут пример минимального консольного приложения, без асинхронности, но для добавления асинхронности достаточно добавить сигналы/слоты и ловить сигнал от QTcpSocket, чтобы затем выпустить уже свой сигнал, назвав его, к примеру, dataReady().

Исходная версия quiet_readonly, :

Нужно создать сигнал для момента, когда данные будут готовы, и в момент готовности делать emit; также надо сделать слот, который обрабатывает готовые данные. По готовности выпускать сигнал, который будет соединён с QApplication::quit.

QEventLoop не нужен, QApplication::exec() сам по себе будет выполняться, пока не будет вызван слот quit. Тут пример минимального консольного приложения, без асинхронности, но для добавления асинхронности достаточно добавить сигналы/слоты и ловить сигнал от QTcpSocket, чтобы затем выпустить уже свой сигнал dataReady().