Форум: "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