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

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

Помогите разобраться с небольшим участком код... [D7, WinXP]


Kolan ©   (2006-01-26 16:07:00) 

Здравствуйте,
Помогите правильно понять следующий код:

 if not WaitCommEvent(FPortHandle, dwMask, @FOverRead) then
   begin
     if GetLastError = ERROR_IO_PENDING then
       WaitForSingleObject(FOverRead.hEvent, INFINITE)
     else
       {//}Err := True;


Примрно так:

Если функция WaitCommEventвернет ложь что означает ...
то проверить последнюю ошибку в потоке.

 Если это ERROR_IO_PENDING,
   то вызвать ф-цию WaitForSingleObject
   (для чего? Что она будет делать?)
 Иначе
    Недождались события, что означает ...


Kolan   (2006-01-27 19:06:00) [1]

С тем что он нигде тобой не вызывается .. ни явно ни неявно ...
Ну я думал что
FreeOnTerminate := True;

как раз и приведет к неявному вызову...

А что значит явно?
procedure TAsyncComPort.Close;
begin
 if Assigned(FReadThread) then
   FReadThread.Terminate;
 CloseHandle(FOverWrite.hEvent);
 CloseHandle(FPortHandle);
  FReadThread.Free;
end;


Так?

В этом случае получается что вызов происходит,

destructor TReadThread.Destroy;
begin
{Break point here}  CloseHandle(FOverRead.hEvent);
 inherited;
end;


но после вызова inheritedснова вызывается деструктор(те сново попадаю на точку останова
а при повторном вызове CloseHandle(FOverRead.hEvent); - external exception
в ntdll.dll.

Как решить эту проблему?
Еще возник вопрос нельзя ли проверить вызывали ли уже   CloseHandleили нет. Те что-то вроде аналога Free где есть проверка на nil.


Набережных С.   (2006-01-27 17:19:00) [2]


> Ботвин Дмитрий   (27.01.06 13:38) [8]


> Он срабатывает тока если потом создается спящим

Чушь. Оно срабатывает, если установлено в TRUE на момент завершения метода Execute - если, разумеется, до этот метода вообще дошло дело.


Digitman   (2006-01-27 16:05:00) [3]


>  с чем это может быть связано?


С тем что он нигде тобой не вызывается .. ни явно ни неявно ...


Ботвин Дмитрий   (2006-01-27 13:38:00) [4]

Kolan ©

>FreeOnTerminate := True; в потоке тоже есть

Он срабатывает тока если потом создается спящим, затем настраиваешь
его свойства и делаешь Resume.


Kolan   (2006-01-27 11:23:00) [5]

Действительно не вызывается а с чем это может быть связано?


Digitman   (2006-01-27 09:22:00) [6]


> FreeOnTerminate := True; в потоке тоже есть


поставь брейкпойнт в тело деструктора объекта класса TReadThread и убедись, что деструктор действительно вызывается


Kolan   (2006-01-26 20:46:00) [7]

Понятно...

Еще вопрос не в тему. Нехочу засорять форум:
Вот в коде пресутствует такие строки:


1. FReadThread := TReadThread.Create(FPortHandle, FReadEvent);

2. FOverRead.hEvent := CreateEvent(nil, True, False, nil);

3. constructor TReadThread.Create(PortHandle: THandle; ReadEvent: TReadEvent);
begin
{...}
{...}
inherited Create(False);
end;


По завершении работы сответственно:

if Assigned(FReadThread) then
   FReadThread.Terminate;
 CloseHandle(FOverWrite.hEvent);
 CloseHandle(FPortHandle);


FreeOnTerminate := True; в потоке тоже есть

Но MemProof  говорит об утечки в этих 3х строках.


Digitman   (2006-01-26 17:07:00) [8]


> Kolan ©   (26.01.06 16:43) [2]


ERROR_IO_PENDING извещает тебя об успешном старте i/o-операции, результаты которой не могут быть в силу тех или иных причин возвращены немедленно


Джо   (2006-01-26 16:58:00) [9]

> [2] Kolan ©   (26.01.06 16:43)
> Если getlasterror возвращает ERROR_IO_PENDING, значит все
> ОК.
> А если нет...?

А если нет, то, следственно, произошла ошибка :0)


Kolan   (2006-01-26 16:43:00) [10]

Если getlasterror возвращает ERROR_IO_PENDING, значит все ОК.
А если нет...?


Reindeer Moss Eater   (2006-01-26 16:36:00) [11]

Работают с портом в асинхронном режиме.
WaitCommEvent при этом должна вернуть Flase.
Если getlasterror возвращает ERROR_IO_PENDING, значит все ОК.
Дальше ждем непосредственно завершения чтения/записи функцией ожидания.


Наверх

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