![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Relrin |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 20.2.2012 Репутация: нет Всего: нет |
Стоит задача в том, чтобы сделать разделяемую память для двух процессов, в котором один процесс записывает данный (пускай какие-то рандомные числа), а второй считывает. Вся эта процедура выводится в консоль с видом типа:
Первый записал: 2 Второй считал: 2 И так далее. Это сделано, но возникла проблемка следущего плана: почему после записи вывод происходит не один раз, а несколько? Быть может кто подскажет? Исходный код основной программы:
Код модуля для работы с мьютексом:
|
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Если честно, то жуть пробирает(((
Зачем на каждом шаге цикла делать
Между прочем, каждому MapViewOfFile должен соответствовать свой UnmapViewOfFile. Бог с ним. Но зачем Вам столько представлений? Достаточного одного... Куча мьютексов, и ни один не защищает разделяемую память((( -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Relrin |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 20.2.2012 Репутация: нет Всего: нет |
Вот так лучше сделать получается? Хотя смысла, определенно, согласушь тут с вами, не было:
Но меня до сих пор мучает вопрос: Почему читает из памяти N раз данные, хотя в цикле ограничивает чтение мьютекс? Это сообщение отредактировал(а) Relrin - 30.10.2012, 20:55 |
||||||
|
|||||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Мьютекс должен быть до MapViewOfFile и освобождение мьютекса после UnmapViewOfFile
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Relrin |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 20.2.2012 Репутация: нет Всего: нет |
Сделал вот-так, но эффект получается как и ранее(запись один раз, считывание N раз):
|
||||
|
|||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Мьютекс только защищает данные, но никак не ограничивает число шагов цикла:
Если же Вы хотите сделать так, что бы первый процесс писал данные в разделяемую память, а второй процесс читал бы их оттуда только после того, как первый закончит запись, то тогда первый процесс должен сигнализировать второму, что данные есть и их можно читать. Это делается через именованное событие. Первый процесс создаёт такое событие в сброшенном виде CreateEvent( NULL, TRUE, FALSE, EVENT_NAME), второй - пытается его открыть OpenEvent(). Эти блоки кода стоит защитить разделяемым мьютексом (первоначально, при создании, занятым первым процессом и освобождаемым лишь после создания события), чтобы первый процесс точно создал событие до того, как второй будет пытаться его открыть. Тогда первый процесс пишет данные и по окончании записи сигнализирует второму SetEvent, что данные есть. Второй процесс сидит на этом событии WaitForSingleObject и ждёт, пока оно освободится, тут же переводя его в сброшенное состояние ResetEvent. И, конечно, операции чтения-записи в разделяемую память должны быть защищены мьютексом, как Вы и сделали))) Добавлено через 7 минут и 13 секунд А что это за процесс создаётся путём CreateProcess? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Relrin |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 20.2.2012 Репутация: нет Всего: нет |
Сделал вот так, за исключением формирования мьютекса, необходимого для создания процесса:
Там создается процесс, аналогичной этой программе. С того же места потом процесс работает парно с родительским, где один записывает, второй считывает информацию.
Это само собой понятно. Я действительно просто не могу понять одной простой вещи: почему запись и чтение работает корректно(вроде как), а вывод считанных данных происходит неоднократно? Хотя вывод дан один раз. В цикле все это находится, т.к. я хочу сделать 10 циклов записи-чтения в память. После того, как второй процесс считал данные из памяти, он выходит из мьютекса, первый на его место заходит, чтобы записать данные. То есть, по мере того, пока первый пишет, второй не должен что-либо делать, выводить, т.е. просто тупо ждать как события, так и мьютекса. То есть, в идеале я хочу видеть, чтобы в консоль выводило примерно так:
А получается:
Это сообщение отредактировал(а) Relrin - 31.10.2012, 13:05 |
||||||||||
|
|||||||||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Вы уверены, что второй процесс ждёт события? А что если вызов OpenEvent вернул NULL? Где обработка ошибок? Здесь неправильная последовательность вызовов. Нужно так:
Поставьте временные метки, когда печатаете прочтено/записано через GetTickCount. Проанализируйте вывод. К сожалению, пока нет времени вникать в тонкости происходящего... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Relrin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 20.2.2012 Репутация: нет Всего: нет |
Сделал вот так теперь:
Почитав в интернете, и пройдя проверку с GetTickCount(), оказалось: когда создавался процесс, до всех операций которые будут происходить, новосозданному процессу подается заново функция main(), т.е. получалось, что плодились дочерние процессы, а следовательно и множественный вывод. Тогда возникает вопрос: а как ограничить создание процессов только одной копией исходной программы? Это сообщение отредактировал(а) Relrin - 31.10.2012, 14:18 |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Создаешь мьютекс, и проверяешь возвращаемое значение если ошибка то программа уже запущена.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Это из-за того самого CreateProcess??? Что-то он мне не понравился с самого начала)))
Вам же нужно два процесса, из них - один дочерний, я правильно понимаю? Тогда создавайте дочерний процесс внутри if'а, проверяющего условие на предсуществование мьютекса:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Relrin |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 20.2.2012 Репутация: нет Всего: нет |
Уже как-то получше смотрится, но все равно пока что-то не так идет: После первой записи данных идет чтение,но чтение идет не один раз, а несколько. Затем процесс завершается
Хотя, в диспетчере задач, я удостоверился, что создается лишь одна копия программы, а не несколько, как было ранее. Код таков сейчас:
Это сообщение отредактировал(а) Relrin - 31.10.2012, 15:09 |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Вот это нужно делать до CreateProcess -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Relrin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 20.2.2012 Репутация: нет Всего: нет |
Только что так и сделал. Результат такой же, как и в предыдущем посте. Добавлено через 2 минуты и 56 секунд Проблему решил. Переместив Sleep(500), в первом процессе до изменений события. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Ну не знаю. Это похоже на гадание, не на программирование. Нужно бы разобраться, почему происходит выход из WaitForSingleObject, сделать контроль ошибок и т.д. Но если и так удовлетворяет, то ладно. Мои поздравления -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |