LINUX.ORG.RU

Программирование в KDevelop 3


0

0

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

★★★★

Да нет причём тут select я говорю про обработчик событий Qt. у меня программа под KDE а не под командную строку... пока не нашол обработчик зделал по таймеру, тоесть каждые полсекунды вызывается функция и проверяет не пришлили данные.

void FormMain::timerDone() { ioctl(fd, FIONREAD, &bytes); if (bytes) { int n; char Buffer[256] = "" ; QString qs;

n = read(fd, Buffer, 256); if (n != -1) { qs = Buffer; flg++; Edittr->setText(qs); } } }

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

блин весь код сехал вот ещё раз

void FormMain::timerDone() {

ioctl(fd, FIONREAD, &bytes);

if (bytes) {

int n; char Buffer[256] = "" ;

QString qs;

n = read(fd, Buffer, 256);

if (n != -1) {

qs = Buffer; flg++;

Edittr->setText(qs);

}

}

}

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

А если запихнуть чтение из ком порта в отдельный поток?

Я сейчас пишу похожий софт. И тоже выбираю между чтением по таймеру и чтением из потока. Пример для таймера есть вот в этой программе: http://cutecom.sourceforge.net/

salnikov_peter
()
Ответ на: комментарий от keeper_b

Эй, ты тупой да? Ты че думаешь раз ты на QT пишешь значит системыне вызовы не используешь?

anonymous
()
Ответ на: комментарий от keeper_b

> Да нет причём тут select я говорю про обработчик событий Qt. у меня программа под KDE а не под командную строку

А какая разница, Qt у тебя или KDE какая-нибудь? select -- он и в Африке работает. Берешь 2 файловых дескриптора: один -- это последовательный порт, второй -- это соединение с иксами. И вешаешь их на select. Когда select отрабатывает -- проверяешь, по какому дескриптору есть данные. Если по порту -- читаешь порт. Если по иксам -- говоришь своей Qt, чтоб она событие из сокета считала и обработала. После этого -- опять в select.

То есть, твоя задача вклиниться во что-то типа qt_main_loop или чего там у этой либы. Т.е. в то место, где события ожидаются. Все равно сама либа события select'ом ждет (ну или poll'ом).

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

Спасибо за обяснение по select просто я не думал что события иксов можно им обрабатывать..... поэтому и не мог понят почему мне селектом все тычат. :)

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

Да, все просто. В теории. На практике же есть ряд нюансов.

1) Qt, AFAIK, ложится поверх Xlib, которая имеет свойство буферизировать некоторые запросы к Х серверу. Поэтому перед вызовом select тебе следует сбросить буфер в сокет. Для этого смотри в сторону XFlush. Возможно, Qt тоже чего-нибудь буферизирует, поэтому погляди в Qt manual.

2) Между сбросом буфера и вызовом select проверь, есть ли события в иксовой очереди. Кроме того, у Qt тоже может быть очередь событий, и неплохо бы ее проверить тоже. Если события есть, их надо обработать до вызова select. А то будут у тебя ситуации типа "нажал клавишу, а прога ее не вводит, пока крысой не подергаешь".

3) Qt наверняка юзает таймер, потому что ей надо текстовым курсором мерцать и автоскролл делать при нажатии на полосу прокрутки. А если таймер, то это уже сигналы. Поэтому, если таймер запущен, select может вернуть тебе управление до того, как появятся данные в дескрипторах. Так что, если данных для чтения нет, все равно тебе надо опять проверять очередь событий Qt -- на предмет событий от таймера. К тому же RTFM на тему, как Qt кладет таймерные события в очередь. А может быть там вообще все не так организовано. Вобщем, придется тебе лезть в потроха этой Qt.

Это все минусы. А плюс у тебя будет всего 1: что прога сделана красиво, а не тяп-ляп на тредах/таймерах/etc.

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