Сохранение основного потока (Qt Application) отзывчивым, пока обрабатывается какой-то другой поток (POSIX)

Сведения о системе / программном обеспечении: Qt Version 4.7.4

Ядро Linux: 2.6.31 (Кастомное ядро, построенное для IMX25)

Периферийные устройства: графический ЖК-дисплей (64x128), модуль Quectel (M 12) GPRS, термопринтер

База данных: Sqlite3

Я новичок, не имеющий большого опыта ни в Qt, ни в программировании на Linux. Я разработал приложение, в котором пользователь вводит некоторые данные вручную, и эти данные сохраняются в базе данных sqlite. Поэтому я пытаюсь сделать так, чтобы через определенное время, скажем, через 90 секунд данные из базы данных были переданы на сервер с использованием GPRS.

Поэтому я использую механизм сигналов и слотов Qt для передачи данных по времени. Я создал слот, который запускается каждые 90 секунд, и, когда слот срабатывает, я создаю / запускаю поток POSIX, который должен передавать данные на сервер.

Таким образом, этот поток запускает pppd, и после запуска pppd запрашивает данные в базе данных и отправляет данные на сервер. И как только передача данных завершена, я убиваю "pppd". Функционал работает отлично.

Но проблема в том, что для запуска pppd требуется время, поэтому мне пришлось ввести некоторую задержку. т. е. сон в течение 12 секунд для успешного запуска pppd. Но поскольку спящий режим блокируется, он не отвечает основной программе / потоку до тех пор, пока не будет запущен "pppd" (т.е. он останавливает / останавливает все действия, такие как печать и т. Д.). И когда "pppd" запущен, основной поток снова становится отзывчивым.

Поэтому, пожалуйста, предложите мне какое-нибудь решение, чтобы основной поток реагировал, когда запускается "pppd", или, пожалуйста, предложите мне, если есть какая-то другая альтернатива для того же. Также наведите меня, если что-то не так с моим подходом..

Заранее спасибо. И мне жаль, если я не следовал вашим стандартам..

1 ответ

Решение

Есть несколько вариантов, доступных для вас. Похоже, что вы используете поток, но затем вызываете sleep в главном потоке, что в основном то же самое, что не использовать поток для выполнения вашей работы вообще! Вам нужно использовать Qt процессы, как показано ниже:

Вы можете использовать QProcess в котором ты start() и использовать сигнал finished() уведомить основной поток, что он завершен. Это, вероятно, то, что вы хотите использовать. Все, что вам нужно сделать, это:

QProcess *proc = new QProcess;
proc->start("theProcess", QStringList() << "the" << "arguments");
connect(proc, SIGNAL(finished()), this, SLOT(someSlotToUse()));

Эта последовательность кода начнет новый процесс с вашими аргументами, а затем вызовет someSlotToUse() когда процесс завершится.

Вы можете использовать QThread по той же схеме.

По сути, вы пытаетесь сделать работу в другом потоке, оставляя реактор с графическим интерфейсом свободным для обработки событий графического интерфейса, а не длинных запросов. Это классическая проблема в Qt и там много литературы.

Кроме того, вы можете использовать QProcess::concurrent() вызов, который позволяет вам запустить функцию в другом процессе, но я никогда не проверял это.

Вот некоторые ссылки для вас: Qt Concurrent, QProcess и QThread

Другие вопросы по тегам