Текущий архив: 2004.07.04;
Скачать: CL | DM;
Вниз
Проблемы с 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 вся ветка
Текущий архив: 2004.07.04;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.027 c