Сделал себе лампу которая по радио-каналу управляется с компьютера. Пришло время писать софт.
Выбрал для этого связку Python2.7 + QT. Блок управления втыкается в USB и в системе появляется виртуальный COM-порт. Поставил библиотеку pySerial и довольно быстро написал приложение которое просто отсылает посылки на лампу при нажатии кнопки.
На самой лампе тоже есть ручное управление так что надо слушать COM-порт и если с лампы пришел сигнал о том что там покрутили ручку — то в окне на компьютере менять состояние на новое у контроллов…
И вот тут встала проблема — кусок программы что слушает COM-порт это цикл бесконечный, а следовательно программа повисает наглухо в этом цикле, окна не отрабатываются и ничего никуда не крутиться…
В самом контроллере у меня действия на прерываниях висят и во времена моей работы в DOS (в далеких 90х годах) я тоже писал софт активно используя прерывания. Но сейчас не те времена и сдается мне это решается как по иному…
У меня для тестов валяется программа Terminal и она работает как надо — тоесть слушает порт и выводит что с него пришло, и все кнопки в окне работают и можно обратно засылать… Вот нечто такое мне и надо получается…
ВОПРОС:
Как пишутся такие приложение, когда надо слушать что пришло из порта например и в то же время чтобы это не вешало программу до тех пор пока это вообще придет? И надо же еще и писать в порт в то время когда оттуда ни что не читается — чтобы команды отсылать обратно и окно отрабатывать…
Я делал на основе terminal.py (пример из библиотеки serial) — класс с методом reader,
который while(1) висит на комп порту и разбирает оттуда байты
Метод запускается в отдельном потоке
Работа с некоторыми объектами изнутри потока обязательно with lock.