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

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

Асинхронная запись


mahab ©   (2010-07-07 00:16:00) 

Привет.Вот это листинг из книги Александра Побегайло.Не могу понять, что именно сигнализирует WaitForSingleObject о завершении записи.
#define _WIN32_WINNT 0x0400
#include
#include
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


Eraser   (2010-07-20 02:13:00) [1]

да, если читать не нужно одновременно из сотен источников,


Anatoly Podgoretsky   (2010-07-19 21:32:00) [2]

> Димка На  (19.07.2010 20:00:12)  [12]

асинхронный доступ к файлам с успехом заменяется синхронным доступом к файлу
в потоке.


Димка На   (2010-07-19 20:00:00) [3]

на практике кто нить использовал асинхронный доступ к файлам? расскажите.


Rouse_   (2010-07-08 12:20:00) [4]

Ну это была шутка :)
На самом деле если ovl.hEvent = 0, то производится следующий вызов KeWaitForSingleObject( &FileObject->Event...


Юрий Зотов   (2010-07-08 09:27:00) [5]


> Rouse_ ©   (07.07.10 23:35) [8]

Саш, ты хочешь сказать, что CreateFile и FindXXXChangeNotification возвращают объекты одного и того же типа?


Rouse_   (2010-07-07 23:57:00) [6]


> Eraser ©   (07.07.10 02:57) [3]
>
> читать http://www.piter.com/book.phtml?978531800296

Там в продаже нет, читать лучше вот так :)
http://rouse.drkb.ru/books.php#rihter1


Rouse_   (2010-07-07 23:35:00) [7]


> Юрий Зотов ©   (07.07.10 06:37) [4]
> Объекта типа "файл" в этом списке нет. Поэтому непонятен
> вызов

Ну не всегда же называть вещи своими именами :)
Change notification есть? Есть - значит корректно :)


Вариант   (2010-07-07 07:37:00) [8]


> mahab ©   (07.07.10 00:16)



> Не могу понять, что именно сигнализирует WaitForSingleObject
> о завершении записи

Handle открытого файла, на котором была выполнена OVERLAPPED операция ввода или вывода. Но этот способ не позволяет определить источник события, если над файлом выполняется одновременно несколько операций асинхронного ввода или вывода.


Вариант   (2010-07-07 07:26:00) [9]


> Юрий Зотов ©   (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   (2010-07-07 06:52:00) [10]

Вам чего Побегайло не нравится что ли?


Юрий Зотов   (2010-07-07 06:37:00) [11]

Из 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).

И вся морковь.


Eraser   (2010-07-07 02:57:00) [12]

читать http://www.piter.com/book.phtml?978531800296


Германн   (2010-07-07 01:50:00) [13]


> mahab ©   (07.07.10 00:28) [1]
>
> Извиняюсь не совсем то спросил.

И совсем не так.
В вопросе должен быть приведён реальный код, который ты проверял. А без него никому не интересно что ты там вычитал из какой-то книги. Тем более из разных глав книги.


mahab   (2010-07-07 00:28:00) [14]

Извиняюсь не совсем то спросил. Если hEvent обозначен как ноль то как же WaitForSingleObject вернется


Наверх

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