Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Синхронные вызовы 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.071 c
2-1339482474
Abcdef123
2012-06-12 10:27
2013.03.22
Медленно работает TdxDBTreeView.


15-1350838886
Лида
2012-10-21 21:01
2013.03.22
Обработка различных событий в Delphi


15-1316779880
xayam
2011-09-23 16:11
2013.03.22
Физики ЦЕРН отменили предел скорости


2-1334905200
Unknown user
2012-04-20 11:00
2013.03.22
Непонятная ошибка компиляции


2-1348029995
Dibed
2012-09-19 08:46
2013.03.22
Преобразование даты и времени





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