Главная страница
    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.042 c
1-1142394627
atruhin
2006-03-15 06:50
2006.04.16
Можно ли увиличить ширину ScrollBar


15-1143447405
Курдль
2006-03-27 12:16
2006.04.16
Ищу идей по технологиям доступа к oracle из программ под Solaris.


2-1143705165
Dyakon_Frost
2006-03-30 11:52
2006.04.16
Как перетащить форму, если нет рамки!


15-1143012272
Alex_Delphi
2006-03-22 10:24
2006.04.16
Oracl открывается только для чтения


15-1143382640
Бугага
2006-03-26 18:17
2006.04.16
Альтернатива www.webfile.ru





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский