|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.12.2011, 21:32 | #1 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
WriteFileEx не выполняется асинхронно
Есть определённая задача и хотелось бы её решить с помощью асинхронной записи данных в файл, начал разбираться, накидал примерчик, и делаю вывод что в моём коде WriteFileEx работает синхронно:
Код:
|
28.12.2011, 10:28 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
суть в том что сама асинхронная операция может завершиться ещё до как функция WriteFileEx вернёт управление. попробуй записать 200 мегабайт данных и сразу всё станет понятно.
при этом записывай данные за одну операцию, выдели буфер размером 200 МБ через функцию VirtualAlloc и запиши за один проход Код:
Последний раз редактировалось rpy3uH; 28.12.2011 в 10:30. |
28.12.2011, 14:19 | #3 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
Время работы WriteFileEx при буфере 200МБ равно 1,7 сек., а функции WaitForSingleObjectEx 5 мксек.
Я всё это пробовал, сегодня появится возможность по тестировать это на разных ОС, я уже думаю что дело в этом... |
28.12.2011, 15:13 | #4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
замерь суммарное время
Код:
|
28.12.2011, 15:43 | #5 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
Замерил суммарное время, да, оно соответствует сумме wrt_* и req_*. Попробовал на WinXP и Win7 - ситуация везде одинаковая.
|
28.12.2011, 16:23 | #6 | |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Код:
Код:
Цитата:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
|
28.12.2011, 16:34 | #7 |
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
Я пробовал и с этим lpCompletionRoutine, но этот параметр _in_opt. Если этот параметр указан, то после перехода потока в тревожное состояние (WaitForSingleObjectEx(..., ..., true)), программа начнёт выполнять очередь APC, куда и будет занесён этот колбэк. Иначе говоря, есть он или нет, разницы нету. Уже сомневаясь во всех моих пониманиях, знаниях и догадках, я попробовал его указать: колбэк вызывается после перехода в тревожное состояние потока, но ситуация осталась прежняя: WriteFileEx работает синхронно.
|
28.12.2011, 16:48 | #8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> Иначе говоря, есть он или нет, разницы нету.
хм, если его нет, у WriteFileEx() просто нет шансов сообщить вам что-либо асинхронно. Если же lpCompletionRoutine указан, то вы: 1) вызываете WriteFileEx() 2) продолжаете заниматься своими делами 3) когда делать совсем уж нечего, переводите поток в alertable wait state и получаете каллбэк Вот такая разница. Впрочем, WriteFileEx() не обязан выполнятся асинхронно, например, если вы пишете в компресированный файл на NTFS, любая запись будет выполнятся синхронно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
28.12.2011, 17:26 | #9 | ||
Новичок
Джуниор
Регистрация: 27.12.2011
Сообщений: 9
|
Цитата:
Цитата:
Код:
1)Сжатие - отсутствует 2)Шифрование файловой системы NTFS - отсутствует 3)Расширение файла - учтено в коде: Код:
|
||
28.12.2011, 17:32 | #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 |