Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с I/O completion port [D7, WinXP]


SMART_n ©   (2004-05-24 18:14:00) 

Есть Handle директории, полученный при помощи CreateFile(). Создаю для него I/O completion port следующей функцией:


FCompletionPort := CreateIoCompletionPort(FHandle, 0, Cardinal(Pointer(Self)), 0);


Необходимо при создании файла в этой директории подождать окончания создания файла и выполнить нужный метод. Для слежения использую ReadDirectoryChanges(), а вот с ожиданием завершения проблемы. Вот кусок кода:


ReadDirectoryChanges( ... ):
GetQueuedCompletionStatus(Parent.FCompletionPort, NumBytes, State, Parent.FPOverlapped, INFINITE);
Self.Synchronize(Self.SendEvent);


То есть перед активированием события по идее GetQueuedCompletionStatus() должен подождать окончания создания файла, но этого не происходит: событие активируется, когда файл ещё не полностью создан...


Polevi   (2004-05-26 07:59:00) [1]

> [10] SMART_n   (25.05.04 20:50)

var
 h:THanlde;
begin
 h:=FindFirstChangeNotification('c:\',false,FILE_NOTIFY_CHANGE_LAST_WRITE);
 if h=INVALID_HANDLE_VALUE then
   RaiseLastOSError;
 WaitForSingleObject(h,INFINITE);
 FindCloseChangeNotification(h);
end;


Игорь Шевченко   (2004-05-25 22:15:00) [2]


> что сдесь понимается под creating - не совсем понятно


Очевидно, занесение информации о создаваемом файле в наблюдаемый файл каталога...


SMART_n   (2004-05-25 20:53:00) [3]

В смысле в данном конкретном случае...


SMART_n   (2004-05-25 20:50:00) [4]

А какой первый параметр для WaitForSingleObject нужно указывать?


Polevi   (2004-05-25 15:45:00) [5]

ладно, сдаюсь
Any file name change in the watched directory or subtree causes a change notification wait operation to return. Changes include renaming, creating, or deleting a file.
- что сдесь понимается под creating - не совсем понятно

с ReadDirectoryChanges не работал, сейчас проверить не могу - не установлен Delphi и MSVC тоже нету..

попробуй вариант [1] - за него я ручаюсь


SMART_n   (2004-05-25 13:20:00) [6]

>как насчет ReadDirectoryChanges?
ReadDirectoryChanges возвращает всё правильно, ведь программа работает, просто если файл большой, то не дожидается окончания создания.

>прочитай ниже и сообщи что возвращает ф-ия GetQueuedCompletionStatus

*lpOverlapped не NULL
Сама функция возвращает -1


Polevi   (2004-05-25 08:48:00) [7]

это замечательно
как насчет ReadDirectoryChanges ?

>На GetQueuedCompletionStatus() стоит следующая проверка:
чудно. где анализ Return Values ?
долго в загадки будем играть ?
прочитай ниже и сообщи что возвращает ф-ия GetQueuedCompletionStatus

Return Values
If the function dequeues a completion packet for a successful I/O operation from the completion port, the return value is nonzero. The function stores information in the variables pointed to by the lpNumberOfBytesTransferred, lpCompletionKey, and lpOverlapped parameters.

If *lpOverlapped is NULL and the function does not dequeue a completion packet from the completion port, the return value is zero. The function does not store information in the variables pointed to by the lpNumberOfBytes and lpCompletionKey parameters. To get extended error information, call GetLastError. If the function did not dequeue a completion packet because the wait timed out, GetLastError returns WAIT_TIMEOUT.

If *lpOverlapped is not NULL and the function dequeues a completion packet for a failed I/O operation from the completion port, the return value is zero. The function stores information in the variables pointed to by lpNumberOfBytes, lpCompletionKey, and lpOverlapped. To get extended error information, call GetLastError.


SMART_n   (2004-05-25 01:25:00) [8]

Функции CreateFile(), CreateIoCompletionPort() всегда возвращают корректные результаты.
На GetQueuedCompletionStatus() стоит следующая проверка:


if (Parent.FPOverlapped <> nil) then <выполнение дальнейших действий>


Polevi   (2004-05-24 23:26:00) [9]

где анализ результатов вызова API ф-ий


SMART_n   (2004-05-24 23:16:00) [10]

Полностью не получится, там он в нескольких модулях, но смысл такой же.


FHandle := CreateFile(PChar(FDirectory),
     FILE_LIST_DIRECTORY, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
       nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);
FCompletionPort := CreateIoCompletionPort(FHandle, 0, Cardinal(Pointer(Self)), 0);
ReadDirectoryChanges(FHandle, @FNotificationBuffer, SizeOf(FNotificationBuffer),
     false, FILE_NOTIFY_CHANGE_FILE_NAME, @FBytesWrite, @FOverlapped, nil);

//Следующие строчки из другого модуля:
GetQueuedCompletionStatus(Parent.FCompletionPort, NumBytes, State, Parent.FPOverlapped, INFINITE);
Self.Synchronize(Self.SendEvent);


Polevi   (2004-05-24 20:49:00) [11]

приведи код полностью, начиная с создания порта


SMART_n   (2004-05-24 20:28:00) [12]

Polevi
И всё же хотелось бы знать, почему в данном случае не срабатывает completion порт?


Polevi   (2004-05-24 18:28:00) [13]

с какого перепугу тут комплишн порт нужен непонятно
вполне хватит FindFirst...Notification и WaitForSingleObject


Наверх

Титульная страница Поиск, карта сайта Написать письмо