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

Вниз

Организация TimeOut для Overlapped чтения из com порта.   Найти похожие ветки 

 
Erik1   (2004-09-09 14:51) [0]

Я хочу узнать можно ли задавать TimeOut при работе с ком портои в Overlapped режиме? Точнее ReadIntervalTimeout?
 Я пользуюсь готовым компонентом "VARIAN ASYNC32 COMPONENT v1.48" и работаю с внешним устройством. Мне надо читать из него пакеты разного размера в зависимости от посланой команды. До этого работал с постояным размером пакета. Считавание производил после проверки:
   repeat
     Sleep(25);
     Inc(i);
   until not (InQueCount < 11 ) or  not (i < 16);
   RSize := Read(PChar(Buffer)^, 12);
---------------------------------------------------------
InQueCount - это фуикция
   ClearCommError(FHandle, Errors, @ComStat);
   Result := ComStat.cbInQue;
Read:
function TCustomComm.Read(var Buf; Count: Integer): Integer;
var
 Overlapped: TOverlapped;
 ErrorCode: Integer;
begin
 Lock;
 try
   FillChar(Overlapped, Sizeof(Overlapped), 0);
   Overlapped.hEvent := FEvent.Handle;
   if not ReadFile(FHandle, Buf, Count, DWord(Result),
     @Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
   begin
     ErrorCode := GetLastError;
     RaiseCommError(sReadError, ErrorCode);
   end;
   if FEvent.WaitFor(FReadTimeout) <> wrSignaled then
     Result := -1
   else
    begin
      GetOverlappedResult(Handle, Overlapped, DWord(Result), False);
      FEvent.ResetEvent;
    end;
 finally
   Unlock;
 end;
end;
---------------------------------------------------------------
Думаю, что при ReadIntervalTimeout := 25 могу гарантировать что данных больше нет. Может есть еще какието идеи по чтению данных?


 
Erik1   (2004-09-09 16:21) [1]

Тоесть если я после вызава функции Read вызову GetOverlappedResult(...,True) то она будет ждать выполнения условия по TimeOut или вобще можно вызвать WaitForSingleObject(1, Overlapped.hEvent, False, 1000)?


 
Erik1   (2004-09-10 10:18) [2]

Что опять никто незнает никого нет? А добавил такую функцию:
function TCustomComm.WaitRead(var Buf: String): Integer;
var
 Overlapped: TOverlapped;
begin
 FillChar(Overlapped, Sizeof(Overlapped), 0);
 Overlapped.hEvent := FEvent.Handle;
 GetOverlappedResult(FHandle, Overlapped, DWord(Result), True);  
 FEvent.ResetEvent;
 SetLength(Buf, Result);
 if not ReadFile(FHandle, PChar(Buf)^, Result, DWord(Result), nil) then
   RaiseCommError(sReadError, GetLastError);
end;
Она предназначена для чтения с ожиданием в асинхроном режиме. Насколько я понимаю, в моем случии WaitCommEvent нафиг нужен?


 
Анатолий   (2004-09-10 10:56) [3]

Почитай это http://bcb.net.ru/article/hard/index003.html. Тут хорошо все это объясняется и есть примеры.


 
Erik1   (2004-09-10 12:07) [4]

Там ничего не обяснено, а приведены вызовы и их параметры. К томуже это я уже читал. Но так и непонял почему моя функция WaitRead ничего нечитает.


 
Chlavik ©   (2004-09-10 16:11) [5]

Если так хочеш что бы всё работало через компонент пишеш наследника TMyComm
у которого добавляеш свой метод read

function TMyComm.Read(var Buf; var Count: Integer): boolean;  //Result - был timout или нет
var
Overlapped: TOverlapped;
ErrorCode: Integer;
begin
Lock;
try
  FillChar(Overlapped, Sizeof(Overlapped), 0);
  Overlapped.hEvent := FEvent.Handle;
  if not ReadFile(FHandle, Buf, Count, DWord(Result),
    @Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
  begin
    ErrorCode := GetLastError;
    RaiseCommError(sReadError, ErrorCode);
  end;
Result := WaitForSingleObject(FEvent.Handle , FReadTimeout)  <>     WAIT_TIMEOUT
 if Result then
  begin
     GetOverlappedResult(Handle, Overlapped, DWord(Result), False);
     FEvent.ResetEvent;
   end;
finally
  Unlock;
end;
end;

а потом делаеш цикл
while TMyComm.Read(Buf,Count) do
begin
// обрабатываеш данные
end;



 
Chlavik ©   (2004-09-10 16:13) [6]

Только ж не TMyComm.Read(Buf,Count) а Экземпляр_TMyComm.Read...


 
Chlavik ©   (2004-09-10 16:15) [7]

ОЙ while FMyComm.TimeoutRead(Buf,Count) do
begin
// обрабатываеш данные
end;

Вот ...


 
Chlavik ©   (2004-09-10 16:18) [8]

Почему ты не юзаеш WaitCommEvent ????


 
Erik1 ©   (2004-09-10 16:31) [9]

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


 
Erik1 ©   (2004-09-10 17:40) [10]

Вопрос снят, ошибка была элементарная вопервых сначала надо было сделать ReadFile а после GetOverlappedResult. И вторая вобще смешно я неправельно задал TimeOut из за того, что при перекрытии процедуры вместо override написал overload :)
Всем спасибо.


 
Erik1 ©   (2004-09-10 17:40) [11]

Вопрос снят, ошибка была элементарная вопервых сначала надо было сделать ReadFile а после GetOverlappedResult. И вторая вобще смешно я неправельно задал TimeOut из за того, что при перекрытии процедуры вместо override написал overload :)
Всем спасибо.



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

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

Наверх





Память: 0.48 MB
Время: 0.033 c
14-1095235276
ghg
2004-09-15 12:01
2004.10.10
вопрос знатокам фортрана


1-1096031373
AdmeraL
2004-09-24 17:09
2004.10.10
TRegIniFile


6-1091593309
Дмитрий Ботвин
2004-08-04 08:21
2004.10.10
Объём оперативной памяти


4-1094559475
kblc
2004-09-07 16:17
2004.10.10
Как для TRichEdit ...


3-1095228605
Geoji
2004-09-15 10:10
2004.10.10
Поиск записи.





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