Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.039 c
15-1143186521
Ega23
2006-03-24 10:48
2006.04.16
С Днём рождения! 24 марта


3-1140422891
evgenij_
2006-02-20 11:08
2006.04.16
имя таблицы с которой работал ADOQuery


9-1128065747
Signate
2005-09-30 11:35
2006.04.16
Ширина строки


15-1143093703
Ega23
2006-03-23 09:01
2006.04.16
С Днём рождения! 23 марта


15-1143032556
MBo
2006-03-22 16:02
2006.04.16
Эксперт для использования в BDS хелпа от D7 или D6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский