-
Привет.Вот это листинг из книги Александра Побегайло.Не могу понять, что именно сигнализирует WaitForSingleObject о завершении записи. #define _WIN32_WINNT 0x0400 #include <windows.h> #include <iostream.h> int main() { HANDLE hFile; // дескриптор файла OVERLAPPED ovl; // структура управления асинхронным доступом к файлу // инициализируем структуру OVERLAPPED ovl.Offset =0; // младшая часть смещения равна 0 ovl.OffsetHigh =0; // старшая часть смещения равна 0 ovl.hEvent =0; // события нет // создаем файл для записи данных hFile = CreateFile( "С: \\demo_file.dat", // имя файла GENERIC_WRITE, // запись в файл FILE_SHARE_WRITE, // совместный доступ к файлу NULL, // защиты нет OPEN_ALWAYS, // открываем или создаем новый файл FILE_FLAG_OVERLAPPED, // асинхронный доступ к файлу NULL // шаблона нет ); // проверяем на успешное создание if (hFile == INVALID_HANDLE_VALUE) { cerr « "Create file failed." « endl « "The last error code: " « GetLastError() « endl; cout « "Press any key to finish."; cin.get(); return 0; } // пишем данные в файл for (int i = 0; i < 10; ++i) { DWORD dwBytesWri te; DWORD dwRet; if (!WriteFile( Глава 27. Асинхронный доступ к данным 503 hFile, // дескриптор файла &i, // адрес буфера, откуда идет запись sizeof(i), // количество записываемых байтов &dwBytesWrite, // количество записанных байтов &ovl // запись асинхронная )) dwRet = GetLastError(); if (dwRet == ERROR_IO_PENDING) cout « "Write file pending." « endl; else { cout « "Write file failed." « endl << "The last error code: " « dwRet « endl; return 0; } } // ждем, пока завершится асинхронная операция записи WaitForSingleObject(hFile, INFINITE); // увеличивает смещение в файле ovl.Offset += sizeof(i); } // закрываем дескриптор файла CloseHandle(hFile); cout « "The file is written." « endl; return 0; }
-
Извиняюсь не совсем то спросил. Если hEvent обозначен как ноль то как же WaitForSingleObject вернется
-
> mahab © (07.07.10 00:28) [1] > > Извиняюсь не совсем то спросил.
И совсем не так. В вопросе должен быть приведён реальный код, который ты проверял. А без него никому не интересно что ты там вычитал из какой-то книги. Тем более из разных глав книги.
-
-
Из MSDN:
The WaitForSingleObject function can wait for the following objects:
Change notification Console input Event Job Memory resource notification Mutex Process Semaphore Thread Waitable timer
===============
Объекта типа "файл" в этом списке нет. Поэтому непонятен вызов WaitForSingleObject(hFile, INFINITE)
===============
Для того, чтобы дождаться завершения записи в файл, надо просто использовать синхронный вызов, без всяких overlapped:
WriteFile(..., nil).
И вся морковь.
-
Вам чего Побегайло не нравится что ли?
-
> Юрий Зотов © (07.07.10 06:37) [4]
Кстати да, MSDN так и говорит в этом разделе. Не очень удобно в том плане, что левая рука не ведает что творит правая, или скорее просто не приведен полный список объектов синхронизации. Ибо уже в разделе MSDN Synchronization and Overlapped Input and Output есть добавления к данному списку
> If no event object is specified in the OVERLAPPED structure, > the system signals the state of the file, named pipe, or > communications device when the overlapped operation has > been completed. Thus, you can specify these handles as synchronization > objects in a wait function, though their use for this purpose > can be difficult to manage. When performing simultaneous > overlapped operations on the same file, named pipe, or communications > device, there is no way to know which operation caused the > object's state to be signaled. It is safer to use a separate > event object for each overlapped operation.
Ну и Рихтер о том же в "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" в главе Асинхронный ввод-вывод на устройствах
> Вы можете вызывать WaitForSingleObject и передавать ей описатель > какого-либо файла, сокета, коммуникационного порта и т. > д.
-
> mahab © (07.07.10 00:16)
> Не могу понять, что именно сигнализирует WaitForSingleObject > о завершении записи
Handle открытого файла, на котором была выполнена OVERLAPPED операция ввода или вывода. Но этот способ не позволяет определить источник события, если над файлом выполняется одновременно несколько операций асинхронного ввода или вывода.
-
> Юрий Зотов © (07.07.10 06:37) [4] > Объекта типа "файл" в этом списке нет. Поэтому непонятен > вызов
Ну не всегда же называть вещи своими именами :) Change notification есть? Есть - значит корректно :)
-
-
> Rouse_ © (07.07.10 23:35) [8]
Саш, ты хочешь сказать, что CreateFile и FindXXXChangeNotification возвращают объекты одного и того же типа?
-
Ну это была шутка :) На самом деле если ovl.hEvent = 0, то производится следующий вызов KeWaitForSingleObject( &FileObject->Event...
-
на практике кто нить использовал асинхронный доступ к файлам? расскажите.
-
> Димка На (19.07.2010 20:00:12) [12]
асинхронный доступ к файлам с успехом заменяется синхронным доступом к файлу в потоке.
-
да, если читать не нужно одновременно из сотен источников,
|