Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Помогите разобраться с небольшим участком код...   Найти похожие ветки 

 
Kolan ©   (2006-01-26 16:07) [0]

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

 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
   (для чего? Что она будет делать?)
 Иначе
    Недождались события, что означает ...


 
Reindeer Moss Eater ©   (2006-01-26 16:36) [1]

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


 
Kolan ©   (2006-01-26 16:43) [2]

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


 
Джо ©   (2006-01-26 16:58) [3]

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

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


 
Digitman ©   (2006-01-26 17:07) [4]


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


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


 
Kolan ©   (2006-01-26 20:46) [5]

Понятно...

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


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-27 09:22) [6]


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


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


 
Kolan ©   (2006-01-27 11:23) [7]

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


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

Kolan ©

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

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


 
Digitman ©   (2006-01-27 16:05) [9]


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


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


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


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


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

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


 
Kolan ©   (2006-01-27 19:06) [11]

С тем что он нигде тобой не вызывается .. ни явно ни неявно ...
Ну я думал что
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.



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

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
3-1140468749
-Антон-
2006-02-20 23:52
2006.04.16
EHLib Rus Help


4-1138731906
Pit
2006-01-31 21:25
2006.04.16
Пропадает Task bar,tray,start.


2-1143830677
dera
2006-03-31 22:44
2006.04.16
БД Access. Есть ключевое поле id типа Счетчик.


15-1143094094
__DATA__
2006-03-23 09:08
2006.04.16
Очистить Desktop после рисования на нем


15-1143021838
Nsk3D
2006-03-22 13:03
2006.04.16
Шрифты.создание.модификация.