Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Синхронные вызовы Read/WriteFile при FILE_FLAG_OVERLAPPED   Найти похожие ветки 

 
SPeller ©   (2010-01-18 06:07) [0]

Подскажите, чреваты ли последствиями синхронные вызовы Read/WriteFile на файле, открытом с FILE_FLAG_OVERLAPPED, когда параметр lpOverlapped = nil? Мсдн настоятельно рекомендует указывать структуру overlapped:

If hFile is opened with FILE_FLAG_OVERLAPPED, the lpOverlapped parameter must not be NULL

но при этом тут же оговаривается:

If hFile is created with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function can report incorrectly that the read operation is complete

Но мне и не нужно получать сигналы о завершении. В примере из мсдн синхронного клиент-сервера вставил FILE_FLAG_OVERLAPPED и в клиенте и на сервере - вроде всё работает как и прежде.

А нужно для того, чтобы писать в двусторонний пайп асинхронно, а читать из него синхронно. Т.е. разные потоки могут писать в пайп в произвольное время в произвольном порядке, пишут они все данные одним блоком, одной операцией WriteFile. А вот читать ответы с другой стороны этого же пайпа нужно синхронно. Читающий поток прочитает полученные пакеты и отдаст нужному потоку. С асинхронной записью и синхронным чтением вроде всё работает, но терзают сомнения, вдруг где-то грабли вылезут?


 
Вариант   (2010-01-18 06:54) [1]


> SPeller ©   (18.01.10 06:07)  


> Подскажите, чреваты ли последствиями синхронные вызовы Read/WriteFile
> на файле, открытом с FILE_FLAG_OVERLAPPED, когда параметр
> lpOverlapped = nil?

Чреваты.


> А нужно для того, чтобы писать в двусторонний пайп асинхронно,
>  а читать из него синхронно

Я так понимаю из контекста не анонимный пайп?

В этом случае - для того, что бы дождаться завершения операции ввода/ вывода  на файле, открытом с FILE_FLAG_OVERLAPPED, сделай после операции ввода/вывода (с lpOverlapped <> nil и корректно заполненной) вызов  GetOverlappedResult c  bWait=true (получим как бы синхронный вызов).


 
SPeller ©   (2010-01-18 07:41) [2]

А чем чревато, если не секрет?
Да, пайп именованный.


 
Вариант   (2010-01-18 09:20) [3]


> SPeller ©   (18.01.10 07:41) [2]

Да наверное тем, что пишет MSDN - а пишет он, что функция неверное сообщит об окончании работы - что это - у меня есть мнение, но не скажу что оно окончательно верное, а потому не буду интерпритировать.
А вот по факту, когда я сам как-то забыл дать структуру, а дал nil, то просто результат функции был false.


 
Rouse_ ©   (2010-01-18 10:42) [4]

А смысл указывания флага FILE_FLAG_OVERLAPPED на читающей стороне, если там явно нужно читать синхронно?


 
Игорь Шевченко ©   (2010-01-18 13:16) [5]


> синхронные вызовы Read/WriteFile на файле, открытом с FILE_FLAG_OVERLAPPED


Это нонсенс. Если файл открыт с флагом FILE_FLAG_OVERLAPPED, это уже подразумевает асинхронные операции


 
SPeller ©   (2010-01-19 00:19) [6]


> А смысл указывания флага FILE_FLAG_OVERLAPPED на читающей
> стороне, если там явно нужно читать синхронно?


> Если файл открыт с флагом FILE_FLAG_OVERLAPPED, это уже
> подразумевает асинхронные операции


Читать нужно синхронно, а писать - асинхронно в один и тот же пайп, хэндл один, пакеты данных приходят и уходят не строго по очереди как в примерах, а в случайном порядке. Сначала попробовал как описал в сабже, но засомневался. Просто никогда с асинхронным режимом не работал, поэтому и вопросы.

Сейчас сделал через GetOverlappedResult(wait), всё работает, и идеологически вроде всё верно.


 
Игорь Шевченко ©   (2010-01-19 00:48) [7]


> Читать нужно синхронно


   rc := ReadFile (FPipe, inBuf, MAX_READ, bytesRead, @OverLapRd);
   if not rc then
     lastError := GetLastError;
   if lastError = ERROR_IO_PENDING then  // Ожидаем завершения ввода-вывода
     WaitForSingleObject (OverLapRd.hEvent, INFINITE);


Самое что ни на есть синхронное чтение


 
SPeller ©   (2010-01-19 03:39) [8]

я почти так же и сделал.
говорю же, никогда с этим не работал, поэтому возникли глупые вопросы :)


 
Игорь Шевченко ©   (2010-01-19 11:14) [9]

SPeller ©   (19.01.10 03:39) [8]

http://www.delphimaster.ru/articles/named_pipes/index.html

тут как раз синхронная работа через асинхронные вызовы


 
SPeller ©   (2010-01-20 03:21) [10]

Спасибо за ссылочку!



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
15-1350631915
AV
2012-10-19 11:31
2013.03.22
MSSQL. Посоветуйте индексы на таблицу


15-1331654585
Unknown user
2012-03-13 20:03
2013.03.22
Альтернатива GetTickCount


2-1347207508
Wadimka
2012-09-09 20:18
2013.03.22
Как запустить cmd.exe как в TotalCommander?


15-1330806605
Юрий
2012-03-04 00:30
2013.03.22
С днем рождения ! 4 марта 2012 воскресенье


4-1262526782
Дмитрий
2010-01-03 16:53
2013.03.22
Как изменить привилегии у процесса?