Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с I/O completion port   Найти похожие ветки 

 
SMART_n   (2004-05-24 18:14) [0]

Есть 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-24 18:28) [1]

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


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

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


 
Polevi ©   (2004-05-24 20:49) [3]

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


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

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


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 23:26) [5]

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


 
SMART_n   (2004-05-25 01:25) [6]

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


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


 
Polevi ©   (2004-05-25 08:48) [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 13:20) [8]

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

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

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


 
Polevi ©   (2004-05-25 15:45) [9]

ладно, сдаюсь
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 20:50) [10]

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


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

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


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


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


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


 
Polevi ©   (2004-05-26 07:59) [13]

> [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;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.037 c
14-1087208942
PenguinX
2004-06-14 14:29
2004.07.04
Фоновый рисунок папки в XP


1-1087552592
Alek
2004-06-18 13:56
2004.07.04
Кодирование ..


14-1087417908
УНЯ
2004-06-17 00:31
2004.07.04
Бесплатный DNS


1-1087510199
Mozart
2004-06-18 02:09
2004.07.04
(повторный запуск приложения) - Stack Overflow в вин98


1-1087329553
AAAlexeyAAA
2004-06-15 23:59
2004.07.04
Ув. мастера. К вам вопрос о представлении типов данных.





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