![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться с небольшим участком код... [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, значит все ОК.
Дальше ждем непосредственно завершения чтения/записи функцией ожидания.