Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизОпрос в бесконечном цикле блокирует программу Найти похожие ветки
← →
WhiteBarin © (2006-06-02 10:26) [0]Здравствуйте!
Как реализовать опрос COM порта в бесконечном цикле?
Опрашивать COM порт я умею
Проблема заключается что при опросе в бесконечном цикле
с выходом по флагу программа блокируется и нажать никакую
кнопку не получается
Как реализвать опрос так чтобы например нажал кнопку СТАРТ и пошёл бесконечный опрос, затем нажал кнопку СТОП опрос остановился
← →
Сергей М. © (2006-06-02 10:28) [1]Либо реализовать "опрос" в доп.потоке либо отказаться от "опроса" в пользу асинхронного неблокирующего режима работы с портом.
← →
ГерманнД (2006-06-02 10:45) [2]Если "в лоб" отвечать на сабж, то достаточно в цикл вставить Application.ProcessMessages.
А если грамотно, то [1]. Причём я за асинхронный режим.
← →
WhiteBarin © (2006-06-02 10:50) [3]немного не понял
> отказаться от "опроса" в пользу асинхронного неблокирующего режима работы с портом.
А что именно делает
Application.ProcessMessages?
какие плюсы какие минусы каждого из вариантов?
← →
ГерманнД (2006-06-02 10:55) [4]
> А что именно делает
> Application.ProcessMessages?
Позволяет программе обрабатывать сообщения Windows.
← →
tesseract © (2006-06-02 11:04) [5]Используй лучше WaitCommMask и асинхронное чтение, сильно экономит такты процессора.
← →
WhiteBarin © (2006-06-02 11:07) [6]Application.ProcessMessages какие плюсы какие минусы этого методо в отличии от
Либо реализовать "опрос" в доп.потоке либо отказаться от "опроса" в пользу асинхронного неблокирующего режима работы с портом
И если не сложно поясните метод с потоком по-подробнее
я понимаю что создать поток и в нём опрашивать или нить, т.е.
другими словами создать программу опрашивающую и главную при старте появляется программа опрашивающая, при стопе закрывается
я попробовал с Application.ProcessMessages вроде бы нормально работает не блокирует работу пользователя, но если например при открытии например другой формы проекта данный цикл как бы останавливается а после закрытия возобновляет свою работу, почему это происходит?
← →
ЮЮ © (2006-06-02 11:08) [7]
>
> Позволяет программе обрабатывать сообщения Windows.
Точнее, сначала будут обработаны накопившиеся сообщения, в том числе рисование окна, клики мышью и т.п., а затем продолжится выполнение кода, откуда было вызвано Application.ProcessMessages
← →
ЮЮ © (2006-06-02 11:11) [8]
> при открытии например другой формы проекта данный цикл как
> бы останавливается
Наверное открытие в модальном режиме? В этом случае и продолжение кода обработчика продолжится только по закрытии модальной формы, а код обработчика это и есть обработка сообщений
← →
WhiteBarin © (2006-06-02 11:18) [9]Да точно как я мог блин упустить модальный вызов!!!
Спасибо
Так мо идее выходом из этого (чтобы не прерывать процесс опроса) является
если в "лоб" вызов других ворм через Show, Hide?
И ещё может быть создать отдельное приложение и в нём опрашивать (получиться отдельный процесс) если опять в "лоб"
Но хочеться красиво реализовать
например создать поток и в нём этот опрос производить но с чего начать не знаю можете подсказать?
← →
tesseract © (2006-06-02 11:40) [10]
> например создать поток и в нём этот опрос производить но
> с чего начать не знаю можете подсказать?
говорю же не опрос лучше, а реакция на маску. Как я понимаю ус-во то-ли сканер то-ли ридер.
Создаём маску на EV_RXCHAR и в соседнем потоке вешаем WaitCommMask и ждём до упора (cancelIO снимет ожидание). потом ClearComError смотрим сколько пришло и считываем данные.
← →
WhiteBarin © (2006-06-02 11:46) [11]Простите немного не пойму у мена не сканер не ридер а программа посылает
сообщение на контроллер и получает от него ответ это я и называю опросом
а смаской не пойму немного, я использую для работы с ком портом компонент
щас вроде бы всё нормально работает только хотелось бы чтобы этот цикл работал в другом потоке, вот и возникает вопрос как создать этот поток и в нём что-либо делать, я понимаю что это азы но никогда не приходилось делать
← →
tesseract © (2006-06-02 12:25) [12]
> сообщение на контроллер и получает от него ответ это я и
> называю опросом
тогда лучше без маски, но с overlapped. В ветке Winapi много кода по этой теме.
поищи.
← →
Evgeny V © (2006-06-02 14:08) [13]На мой взгляд лучше в отдельном потоке использовать WaitCommEvent, порт открывать для асинхронной работы. Если вы используете компонент, то возможно в нем уже есть реализация всего сказанноговам ранее в том или ином видею Про маску - функция WaitCommEvent ожидает события на порту, или в случае асинхронной работы будет взведено событие, указанное в overlapped структуре, переданной WaitCommEvent в качестве параметра.
Какие события порта будут вас интерисовать, вы указываете функцией SetCommMask. Рекомендую посмотреть описание этих функции, почитать стать по работе с портами, в интернете их полно. Есть и готовые хорошие компоненты, раньше видел много на www.torry.net Про потоки - посмотрите класс TThread.
← →
tesseract © (2006-06-02 14:29) [14]Ну можно и так и так, просто после посылки команды, ус-во отвечает в пределах 200 мс.
← →
Kolan © (2006-06-02 14:31) [15]
> WhiteBarin © (02.06.06 10:26)
Могу поделится только что добитым(может еще на доконца)... кодом.
Два класса 1 работас портом. 2 поток для организации бесконечного опроса.
Если что-то приходит тут-же выдаёт..
← →
WhiteBarin © (2006-06-02 14:39) [16]Могу поделится только что добитым(может еще на доконца)... кодом.
Два класса 1 работас портом. 2 поток для организации бесконечного опроса.
Если что-то приходит тут-же выдаёт..
Хотелось бы посмотреть на исходники
← →
Kolan © (2006-06-02 15:31) [17]Почту давай...
← →
Kolan © (2006-06-02 15:34) [18]Пардон, ушло...
← →
Kolan © (2006-06-02 15:40) [19]Извеняюсь за личную переписку,
Но не ушло таки, а вернулось назад. Свяжитесь со мной по ICQ(она в анкете), чтобы не засорять форум...
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.01 c