LINUX.ORG.RU

Работа с файлом устройства из GTK приложения

 


0

1

Мне нужно написать программу, которая будет принимать пакеты данных, приходящие по COM-порту и отображать их в няшном окошке в обработанном виде. Использовать буду тулкит GTK3, потому что уже достаточно хорошо его знаю. С тем чтобы открыть COM-порт и настроить его параметры я справился, но как читать данные? В консольной программе, которую я написал до этого, всё было просто - я использовал select, но для GUI приложения нужно использовать средствами тулкита, чтобы ожидание данных было интегрировано в основной цикл и не замораживало приложение.

Как это сделать на GTK3? Язык - Си.

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)

Ответ на: комментарий от xterro

Я умею работать с COM-портом. Проблема в том, что если вызывать read или select, то окно приложения зависнет пока не придут данные, а это не хорошо. Вроде как в GLib/GTK есть способ заставить мониторить их файловый дескриптор в основном цикле и вызвать мой callback при готовности данных.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Естественно, потому что чтение данных выполняется в том же потоке что и UI, вынеси чтение данных в отдельный поток и будет тебе счастье.

xterro ★★★★★
()
Ответ на: комментарий от xterro

Сделал в отдельном потоке, всё работает. Разве что не знаю насколько безопасно обновлять текст на GtkLabel не из UI потока.

Но правильно ли такое решение...

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

не знаю насколько безопасно обновлять текст на GtkLabel не из UI потока

Лучше обновляй в UI потоке через g_timeout_add.

monk ★★★★★
()
Ответ на: комментарий от ananas

Отлично, именно это мне и было нужно. Большое спасибо. Переделал на использование GIOChannel и теперь и чтение, и рисование UI происходит в одном потоке, но без фризов приложения, а я могу больше не бояться, что что-то упадёт от изменения GtkLabel вне основного потока.

KivApple ★★★★★
() автор топика

Попробуй заиспольовать GIO

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.