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