Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 08:21   #1
sercher
 
Регистрация: 10.04.2011
Сообщений: 3
По умолчанию Ассинхронная запись /чтение

Здравствуйте.
Пытаюсь проводить запись чтение больших файлов и одновременно выполнять ряд побочных функций используя асинх-ю передачу(fasm, win64):

Код:
invoke  GetProcessHeap
invoke  HeapAlloc,rax,0,125*1024*1024
mov     [pmemory],rax

invoke  GetLastError
invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,rax,0,horhe,100,0
invoke  MessageBox,0,horhe,horhe,0 
   
invoke  CreateFile,_testfile,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0
mov     [hfile],rax

invoke  GetLastError
invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,rax,0,horhe,100,0
invoke  MessageBox,0,horhe,horhe,0 

invoke  ReadFileEx,[hfile],[pmemory],125*1024*1024,lpoverlap,FileIOCompletionRoutine

invoke  GetLastError
invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,rax,0,horhe,100,0
invoke  MessageBox,0,horhe,horhe,0 

\\\
побочные функции в цикле
\\\

proc FileIOCompletionRoutine ErrorCode,ErrorCode,lpOverlapped
       invoke MessageBox,0,0,0,0 ;для теста
.finish:
        ret
endp

struct OVERLAPPED
Internal dq 0
InternalHigh dq 0
union
struct
Offset dd 1024
OffsetHigh dd 0
ends
Pointer dq 0
ends
hEvent dq 0
ends
lpoverlap OVERLAPPED
horhe rb 1024
Как я понял из msdn когда закончиться чтение, функ-я ReadFileEx, вызовет процедуру FileIOCompletionRoutine и должен появиться тестовый мессейчбокс.... но он не появляться.. GetLastError на всех стадиях выдает "операция прошла успешно" . Что я делаю не так?

Последний раз редактировалось Stilet; 10.04.2011 в 16:52.
sercher вне форума Ответить с цитированием
Старый 10.04.2011, 10:06   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> GetLastError на всех стадиях выдает "операция прошла успешно"

это значит, что драйвер решил, что затевать асинхронное чтение нет смысла, и выполнил ваш запрос синхронно.

Если бы операция пошла асинхронно, GetLastError вернула бы ERROR_IO_PENDING
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 10.04.2011 в 16:11.
veniside вне форума Ответить с цитированием
Старый 10.04.2011, 10:22   #3
sercher
 
Регистрация: 10.04.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> GetLastError на всех стадиях выдает "операция прошла успешно"

это значит, что драйвер решил, что затевать ассинхронное чтение нет смысла, и выполнил ваш запрос синхронно.

Если бы операция пошла ассинхронно, GetLastError вернула бы ERROR_IO_PENDING
А в каких случаях будет использоваться асинхрон?(размеры файлов около 600мб все разного содержания)
sercher вне форума Ответить с цитированием
Старый 10.04.2011, 16:47   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хм, похоже, я был не прав. С ReadFileEx() ситуация немного другая.

ERROR_IO_PENDING там не возвращается, а для того, чтобы вызвалась FileIOCompletionRoutine процедура, нужно текущий поток перевести в alertable wait state, вызвав, например:

Код:
SleepEx(100, true);
При этом, похоже, операция всё-таки выполняется синхронно, т.к. ReadFileEx() не возвращает управление почти 200 мс, а когда управление вернулось, сразу же вызывается FileIOCompletionRoutine. Т.е. смысла никакого нет.

> каких случаях будет использоваться асинхрон?

а фиг знает, у меня ReadFile()/ReadFileEx() тоже всегда выполняется синхронно. Возможно, нужно их вызывать из разных потоков одновременно.
Нужно пробовать с WriteFile()/WriteFileEx(), во всяком случае WriteFile() часто выполняется асинхронно, это точно (при вызове из разных потоков).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение\запись в файл VirtualAngel Помощь студентам 2 12.02.2011 12:54
Чтение>сортировка>запись theFEAR Помощь студентам 1 22.04.2009 09:33
Запись/чтение из файла (С++) alexov Общие вопросы C/C++ 15 18.01.2009 17:35
Чтение и запись FilMapping Micher85 Общие вопросы Delphi 0 28.10.2008 22:33
Запись и чтение сообщений Altera Работа с сетью в Delphi 6 13.04.2008 03:31