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

Вниз

Асинхронная запись   Найти похожие ветки 

 
mahab ©   (2010-07-07 00:16) [0]

Привет.Вот это листинг из книги Александра Побегайло.Не могу понять, что именно сигнализирует 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;
}


 
mahab ©   (2010-07-07 00:28) [1]

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


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


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

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


 
Eraser ©   (2010-07-07 02:57) [3]

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


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

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

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


 
mahab ©   (2010-07-07 06:52) [5]

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


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


> Юрий Зотов ©   (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 и передавать ей описатель
> какого-либо файла, сокета, коммуникационного порта и т.
> д.


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


> mahab ©   (07.07.10 00:16)



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

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


 
Rouse_ ©   (2010-07-07 23:35) [8]


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

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


 
Rouse_ ©   (2010-07-07 23:57) [9]


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

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


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


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

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


 
Rouse_ ©   (2010-07-08 12:20) [11]

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


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

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


 
Anatoly Podgoretsky ©   (2010-07-19 21:32) [13]

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

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


 
Eraser ©   (2010-07-20 02:13) [14]

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



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

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

Наверх





Память: 0.48 MB
Время: 0.079 c
3-1311770178
SQLEXPRESS
2011-07-27 16:36
2017.01.15
Ни кто не не желает в SQL размяться? Время исполнения


15-1455954062
Beck
2016-02-20 10:41
2017.01.15
Правильная реализация


2-1425301615
Sopelka
2015-03-02 16:06
2017.01.15
datatime + - gmt


15-1452503308
Копир
2016-01-11 12:08
2017.01.15
Убить программиста.


2-1426051919
goga_m
2015-03-11 08:31
2017.01.15
Проблема с запросом в Access





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