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

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

Организация TimeOut для Overlapped чтения из com порта. [D5, Win2k]


Erik1 ©   (2004-09-09 14:51:00) 

Я хочу узнать можно ли задавать 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-10 17:40:00) [1]

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


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

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


Erik1   (2004-09-10 16:31:00) [3]

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


Chlavik   (2004-09-10 16:18:00) [4]

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


Chlavik   (2004-09-10 16:15:00) [5]

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

Вот ...


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

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


Chlavik   (2004-09-10 16:11:00) [7]

Если так хочеш что бы всё работало через компонент пишеш наследника 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;


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

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


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

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


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

Что опять никто незнает никого нет? А добавил такую функцию:
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 нафиг нужен?


Erik1   (2004-09-09 16:21:00) [11]

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


Наверх

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