Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

Опрос в бесконечном цикле блокирует программу   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
15-1150579053
Ломброзо
2006-06-18 01:17
2006.07.16
Помогите победить девайс


2-1151410551
tony
2006-06-27 16:15
2006.07.16
Открыть файл


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


2-1151302138
mariya_mezenceva
2006-06-26 10:08
2006.07.16
проблема с dll


3-1147454543
skichyp
2006-05-12 21:22
2006.07.16
не могу законнектиться с локального





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский