| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Синхронизация мьютекс |
| Автор: evgovs1991 30.10.2015, 19:05 |
| Разбираюсь с мьютексами и синхронизацией приложений. Создал редактор.В нем есть диалог печати если запущены несколько копий редактора и в одном из них открыт диалог печати, то в остальных копиях диалог печати не открывается и выдается сообщение о том, что принтер занят а для синхронизации использовать мьютек надо. Помогите разобратся что и как? |
| Автор: Alexeis 30.10.2015, 19:36 |
| evgovs1991, возможно это просто ограничение Windows. Принтер ведь последовательное устройство. На нем нельзя печать 2 документа одновременно. Не думаю что мьютекс тут поможет. Мьютекс нужен когда в программе имеется несколько потоков. |
| Автор: evgovs1991 30.10.2015, 19:51 | ||
вопрос в том как запретить открывать окно диалога печати...mainmenu компонент там кнопка вызывающая диалог печати...ну вот когда я запустил две копии а в одной из них открыт этот диалог...то в другой нельзя его открыть...как то так |
| Автор: Crystaly 2.12.2015, 23:04 |
| Alexeis, два редактора это и есть два потока, которые хотят получить доступ к общему ресурсу (принтер) evgovs1991, надо запросить мьютекс у системы. про мьютексы windows здесь: https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686927%28v=vs.85%29.aspx про использование мьютексов написано с примерами (англ). Обратить внимание на функцию CreateMutex() - создание мьютекса, там есть параметр lpName - имя мьютекса. Наверно, все редакторы (потоки) должны создать мьютекс с одним именем. Только первый поток успешно создаст мьютекс, остальные (запущенные позже) получат ошибку - тогда проверить причину ошибки и выяснить что такой мьютекс уже создан и получить на него ссылку (обработчик). И далее использовать (вызывать перед печатью). А вот освобождать мьютекс должен только последний поток - редактор который закрывается последним. Для этого наверно надо использовать "семафор" (semaphore) - создается также как и мьютекс. про семафоры windows здесь: https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686946%28v=vs.85%29.aspx семафор имеет (я так думаю) счетчик, который увеличивается на 1 когда каждый поток запускается, и уменьшается на 1 когда каждый поток закрывается. Перед закрытием каждый поток проверяет семафор и закрывает (освобождает) мьютекс когда семафор обнуляется. Таким образом, все редакторы (потоки) должны иметь один общий мьютекс для получения доступа к принтеру и один общий семафор для учета сколько редакторов (потоков) запущено. Как-то так. |