Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа в потоке, Ну, типа, работа в потоке 
:(
    Опции темы
Гость_space
Дата 25.3.2005, 10:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вопрос к знатокам потоков.
Попробовал работать с Com-портом, как это описывается в статье "Работа с COM-портами под Windows" (Автор статьи: Pasha). Кстати, спасибо ему большое. Там создаётся поток для приёма с порта вот так:

Код

CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);


А сама процедура приёма вот такая:

Код

 procedure ReadComm;
  var
   Resive:array [0..255] of char;
  begin
     while true do
   begin
    TransMask:=0;
    WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
    if (TransMask and EV_RXCHAR)=EV_RXCHAR then //проверяем нужное событие
     begin
      ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
      Kols := Stat.cbInQue;
      ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
      //тут должна идти обработка принятой информации из Resive
      Form1.Panel1.Caption:=string(Resive[0]);
      //не очень хороший вариант вывода, но для примера подойдет
     end;//mask
    end;//while
  end;


Всё работает, только из-за вечного цикла в этой процедуры пожираются все ресурсы процессора. А как этого избежать? Как заставить процедуру выполняться только по событию? Ну, в смысле, по приёму символа.

Это сообщение отредактировал(а) Alex - 25.3.2005, 23:45
  Вверх
_hunter
Дата 25.3.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



я может чего-то не понимаю, но в этом коде есть ожидание события...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Гость_space
Дата 25.3.2005, 16:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот - вот! Почему - то ожидание события и пожирает ресурсы!
  Вверх
_hunter
Дата 25.3.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



ну дай ему приоритет пониже...
+ попробуй запустить без потока и посмотри как себя код ведет...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Гость_space
Дата 25.3.2005, 18:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сделал экскремент, в результате чего выяснилось, что WaitCommEvent и не думает ничего ждать, а возвращает "0" если нет события и флаг события, если оно произошло. Вот фигня!
  Вверх
_hunter
Дата 25.3.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



во первых вызови GetLastError() -- узнаеш в чем вообще проблема
+ есть подозрение что проблема в маске -- EvtMask, равной 0 я не нашел...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Гость_space
Дата 26.3.2005, 10:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2hunter
Вызвал GetLastError() - ошибки то нет! Так что такая вот WaitCommEvent, совсем она ничего и не wait... Поэтому вставил я просто sleep(10) в цикл ожидания и всё стало просто изумительно - всё работает и ресурсов не жрёт.
  Вверх
p0s0l
Дата 26.3.2005, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



В WaitCommEvent последний параметр должен быть nil, иначе у тебя не синхронное ожидание, а асинхронное (если порт открыт с флагом OVERLAPPED), (т.е. никакого ожидания не будет, если не ждать события Wait...Object)...
То же самое касается ReadFile...



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 26.3.2005, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Перенесенно из раздела Delphi


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.