Главная страница
    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.47 MB
Время: 0.079 c
15-1339653614
KSergey
2012-06-14 10:00
2013.03.22
Ассемблерные вставки и переносимость кода


15-1331584202
Юрий
2012-03-13 00:30
2013.03.22
С днем рождения ! 13 марта 2012 вторник


3-1278794858
jziiiiiii
2010-07-11 00:47
2013.03.22
access adotable


2-1328179304
cardon
2012-02-02 14:41
2013.03.22
Подсказка в StringGrid


15-1328345338
Rouse_
2012-02-04 12:48
2013.03.22
Засоветуйте WiFi роутер





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