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

Вниз

Проблемы с com портом   Найти похожие ветки 

 
shalex ©   (2005-11-09 12:17) [0]

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


 
clickmaker ©   (2005-11-09 12:30) [1]


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

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


 
shalex ©   (2005-11-09 12:36) [2]

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


 
clickmaker ©   (2005-11-09 13:08) [3]


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

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

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

End
PurgeComm()
CloseHandle()

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


 
shalex ©   (2005-11-09 14:48) [4]

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


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


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

С уважением.


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

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


 
shalex ©   (2005-11-09 20:25) [7]

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

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


 
Sky ©   (2005-11-10 07:02) [8]

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


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


>  Destroy то есть?

Есть.

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


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

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


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


> Что за FeventThread ?


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


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


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


 
Digitman ©   (2005-11-10 13:51) [12]


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


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

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


 
shalex ©   (2005-11-10 14:30) [13]


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


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


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

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


 
shalex ©   (2005-11-10 15:10) [15]


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


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


 
Digitman ©   (2005-11-10 15:13) [16]


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


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

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


 
shalex ©   (2005-11-10 15:19) [17]

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

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

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


 
Digitman ©   (2005-11-10 15:24) [18]


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


не верю.


 
tesseract ©   (2005-11-10 16:15) [19]

>>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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.036 c
14-1135887655
Джо
2005-12-29 23:20
2006.01.22
Прокси-сервера


14-1135500103
TUser
2005-12-25 11:41
2006.01.22
Давно возникло мнение


2-1135460866
ZeFiR
2005-12-25 00:47
2006.01.22
Как реализовать следующее?


2-1136541216
Дева
2006-01-06 12:53
2006.01.22
Надежность баз данных


14-1135263307
LordOfRock
2005-12-22 17:55
2006.01.22
Opera s BUGS





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский