Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с com портом


shalex ©   (2005-11-09 12:17:00) 

В com порт постоянно поступает информация, но при закрытии порта программа полностью виснет, т.е. виснет только тогда, когда буфер com порта не пустой. Как решить данную проблему?


tesseract   (2005-11-10 16:15:00) [1]

>>ReadFile(FHandle, Buf, Count, BytesTrans, @AsyncPtr^.Overlapped)

странный такой overlapped.
И перед закрытием порта рекомендую CancelIO(Fhandle)? а Сколько там в буфере не важно

И Где WaitForSingleObject ?

> FeventThread - это поток события, который  создается при
> открытии порта, у меня используется для чтения


Просто интересно а зачем отдельно создавать тред для чтения. Если можно создавать все переменные и дескрипторы для чтения при его создании у автоматом удалять при убийстве???? И проблем с синхронизацией будет меньше.

Из моего проекта :


if fComWait(size) then
    begin
    succ :=ReadFile(hCom,buffer,size,result,@REadOL);
      if not succ then
            begin
             tmp:=GetLastError;
              if tmp=ERROR_IO_PENDING then
              if WaitForSingleObject(ReadOl.hEvent,WaitInt)=WAIT_OBJECT_0 then
               if GetOverlappedResult(hCom, ReadOL, fREad,true)  then
                Succ:=true;
              end; // if not succ
 end // if fComWait


Digitman   (2005-11-10 15:24:00) [2]


> shalex ©   (10.11.05 15:19) [17]


не верю.


shalex   (2005-11-10 15:19:00) [3]

Оставил только  это:

PurgeComm(FHandle, PURGE_TXABORT or PURGE_RXABORT);
CloseHandle(FHandle);

Результат тот же.


Digitman   (2005-11-10 15:13:00) [4]


> shalex ©   (10.11.05 15:10) [15]


тело метода close включает более чем один оператор

какой из них вызывает "вис" - ты выяснил ?


shalex   (2005-11-10 15:10:00) [5]


> а протоколирование в файл хода выполнения программы ?
> разве не средство отладки ?


Я то знаю где у меня виснет программа - на методе close компоненты, а работу компоненты мне тоже протоколировать в файл?
Да в принципе понятно, ГДЕ ошибка появляется, но непонятно КАКАЯ. Окно с ошибкой не появляется.


Digitman   (2005-11-10 14:33:00) [6]

а протоколирование в файл хода выполнения программы ?
разве не средство отладки ?


shalex   (2005-11-10 14:30:00) [7]


> отладчик тебе на что Борландом дан


Если бы было так легко. На мощной машине ошибка не проявляется, а на той даже delphi не встанет, а если встанет, то не загрузится :(


Digitman   (2005-11-10 13:51:00) [8]


> Может здесь что-то висит?


может - не может ... висит - не висит ..

отладчик тебе на что Борландом дан ?


shalex   (2005-11-10 13:32:00) [9]


> Что за FeventThread ?


FeventThread - это поток события, который  создается при открытии порта, у меня используется для чтения


> И какой там Read?


ReadFile(FHandle, Buf, Count, BytesTrans, @AsyncPtr^.Overlapped)


tesseract   (2005-11-10 10:00:00) [10]

Что за FeventThread ?
И какой там Read?


shalex   (2005-11-10 09:16:00) [11]


>  Destroy то есть?

Есть.

Начал изучать исходник, метод close примерно выглядит так:
PurgeComm(FHandle, PURGE_TXABORT or PURGE_RXABORT);
   if FThreadCreated then
   begin
     FEventThread.Free;  // Может здесь что-то висит?
     FThreadCreated := False;
   end;
CloseHandle(FHandle);


Sky   (2005-11-10 07:02:00) [12]

Топором по компоненту пробовал? Destroy то есть?


shalex   (2005-11-09 20:25:00) [13]

Я уже не знаю как более подробно описать проблему.
Но когда компьютер не успевает обрабатывать приходящую в порт информацию (медленный компьютер или комп занят еще каким-либо процессом), т.е. буфер порта не пустой, то при закрытии порта программа ИНОГДА виснет.
Пробовал работать с разными comport-компонентами -  без разницы.

То есть мне перед закрытием порта нужно удостовериться, что в данный момент "входящая" информация не обрабатывается событием компоненты.
Как это узнать я не знаю.


KostR   (2005-11-09 15:34:00) [14]

опиши подробнее. Такой проблемы в принципе быть не должно, т.к. опустошен или заполнен буфер - этот факт мало волнует компоненту.


wal   (2005-11-09 15:05:00) [15]


> [4] shalex ©   (09.11.05 14:48)
> Пользуюсь компонентом ...
Вывод сам собой напрашивается.

С уважением.


shalex   (2005-11-09 14:48:00) [16]

Пользуюсь компонентом (разные пробовал - везде одинаково), при вызове метода close иногда виснет, возможно виснет именно в тот момент, когда выполняется событие по обработке принятой информации из буфера.
Пробую перед закрытием порта очистить буфер, стало лучше, но не всегда помогает.
Как мне перед закрытием порта узнать пуст ли буфер?


clickmaker   (2005-11-09 13:08:00) [17]


> shalex ©   (09.11.05 12:36) [2]

ну у тебя там цикл скорей всего, что-то типа такого:

while()
begin
  WaitCommEvent() или GetCommState()
  ReadFile()

End
PurgeComm()
CloseHandle()

и что, на последней строчке зависает?


shalex   (2005-11-09 12:36:00) [18]

Это понятно, но как порт закрыть, когда буфер пустой, если в порт постоянно поступает информация? Я пробовал разные методы "опустошения" буфера порта, но ничего не получается, может что-то не так делаю... Есть конкретные предложения?


clickmaker   (2005-11-09 12:30:00) [19]


> Как решить данную проблему?

закрывать порт, когда буфер пустой


Наверх

Титульная страница Поиск, карта сайта Написать письмо