Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.026 c
2-1151565058
lobach
2006-06-29 11:10
2006.07.16
Image...


4-1144230639
AlexeyT
2006-04-05 13:50
2006.07.16
Как определить отключенный сетевой диск?


15-1150564169
TUser
2006-06-17 21:09
2006.07.16
Это сделали взрослые


10-1121847387
serjufa
2005-07-20 12:16
2006.07.16
в листе excel нарисовать стрелки


15-1150426972
Файл
2006-06-16 07:02
2006.07.16
Чем отличается МЕ от ХР с точки зрения Дельфи 7 ?