![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
![]()
Есть определённая задача и хотелось бы её решить с помощью асинхронной записи данных в файл, начал разбираться, накидал примерчик, и делаю вывод что в моём коде WriteFileEx работает синхронно:
Код:
|
![]() |
![]() |
![]() |
#2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
суть в том что сама асинхронная операция может завершиться ещё до как функция WriteFileEx вернёт управление. попробуй записать 200 мегабайт данных и сразу всё станет понятно.
при этом записывай данные за одну операцию, выдели буфер размером 200 МБ через функцию VirtualAlloc и запиши за один проход Код:
Последний раз редактировалось rpy3uH; 28.12.2011 в 10:30. |
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
![]()
Время работы WriteFileEx при буфере 200МБ равно 1,7 сек., а функции WaitForSingleObjectEx 5 мксек.
Я всё это пробовал, сегодня появится возможность по тестировать это на разных ОС, я уже думаю что дело в этом... |
![]() |
![]() |
![]() |
#4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
замерь суммарное время
Код:
|
![]() |
![]() |
![]() |
#5 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
![]()
Замерил суммарное время, да, оно соответствует сумме wrt_* и req_*. Попробовал на WinXP и Win7 - ситуация везде одинаковая.
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]() Код:
Код:
Цитата:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
|
![]() |
![]() |
![]() |
#7 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
![]()
Я пробовал и с этим lpCompletionRoutine, но этот параметр _in_opt. Если этот параметр указан, то после перехода потока в тревожное состояние (WaitForSingleObjectEx(..., ..., true)), программа начнёт выполнять очередь APC, куда и будет занесён этот колбэк. Иначе говоря, есть он или нет, разницы нету. Уже сомневаясь во всех моих пониманиях, знаниях и догадках, я попробовал его указать: колбэк вызывается после перехода в тревожное состояние потока, но ситуация осталась прежняя: WriteFileEx работает синхронно.
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Иначе говоря, есть он или нет, разницы нету.
хм, если его нет, у WriteFileEx() просто нет шансов сообщить вам что-либо асинхронно. Если же lpCompletionRoutine указан, то вы: 1) вызываете WriteFileEx() 2) продолжаете заниматься своими делами 3) когда делать совсем уж нечего, переводите поток в alertable wait state и получаете каллбэк Вот такая разница. Впрочем, WriteFileEx() не обязан выполнятся асинхронно, например, если вы пишете в компресированный файл на NTFS, любая запись будет выполнятся синхронно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#9 | ||
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
![]() Цитата:
Цитата:
Код:
1)Сжатие - отсутствует 2)Шифрование файловой системы NTFS - отсутствует 3)Расширение файла - учтено в коде: Код:
|
||
![]() |
![]() |
![]() |
#10 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
![]()
Хочу ещё добавить, что если вместо функции WriteFileEx использовать WriteFile, то она возвращает false, а GetLastError == ERROR_IO_PENDING, что означает выполнение асинхронной операции, хотя наряду с этим функция WriteFile возвращает управление только после того, как все данные в файл запишутся. Опять синхронный вариант.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не выполняется макрос | allichka | Microsoft Office Excel | 5 | 19.05.2011 14:47 |
не выполняется условие | Link12 | Общие вопросы C/C++ | 6 | 30.03.2010 19:36 |
Странное поведение WriteFile / WriteFileEx (асинхронный I/O) | besserebrenik | Win Api | 0 | 22.02.2010 20:37 |
Компилируется,но не выполняется. | Lunex.08 | C++ Builder | 6 | 19.11.2009 12:17 |