Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с небольшим участком код... Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.05 c