|
|
|
evgovs1991 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 9.10.2014 Репутация: нет Всего: нет |
Разбираюсь с мьютексами и синхронизацией приложений. Создал редактор.В нем есть диалог печати если запущены несколько копий редактора и в одном из них открыт диалог печати, то в остальных копиях диалог печати не открывается и выдается сообщение о том, что принтер занят а для синхронизации использовать мьютек надо. Помогите разобратся что и как?
|
|||
|
||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
evgovs1991, возможно это просто ограничение Windows. Принтер ведь последовательное устройство. На нем нельзя печать 2 документа одновременно. Не думаю что мьютекс тут поможет. Мьютекс нужен когда в программе имеется несколько потоков.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
evgovs1991 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 9.10.2014 Репутация: нет Всего: нет |
вопрос в том как запретить открывать окно диалога печати...mainmenu компонент там кнопка вызывающая диалог печати...ну вот когда я запустил две копии а в одной из них открыт этот диалог...то в другой нельзя его открыть...как то так |
|||
|
||||
Crystaly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 2.12.2015 Репутация: нет Всего: нет |
Alexeis, два редактора это и есть два потока, которые хотят получить доступ к общему ресурсу (принтер)
evgovs1991, надо запросить мьютекс у системы. про мьютексы windows здесь: https://msdn.microsoft.com/ru-ru/library/wi...v=vs.85%29.aspx про использование мьютексов написано с примерами (англ). Обратить внимание на функцию CreateMutex() - создание мьютекса, там есть параметр lpName - имя мьютекса. Наверно, все редакторы (потоки) должны создать мьютекс с одним именем. Только первый поток успешно создаст мьютекс, остальные (запущенные позже) получат ошибку - тогда проверить причину ошибки и выяснить что такой мьютекс уже создан и получить на него ссылку (обработчик). И далее использовать (вызывать перед печатью). А вот освобождать мьютекс должен только последний поток - редактор который закрывается последним. Для этого наверно надо использовать "семафор" (semaphore) - создается также как и мьютекс. про семафоры windows здесь: https://msdn.microsoft.com/ru-ru/library/wi...v=vs.85%29.aspx семафор имеет (я так думаю) счетчик, который увеличивается на 1 когда каждый поток запускается, и уменьшается на 1 когда каждый поток закрывается. Перед закрытием каждый поток проверяет семафор и закрывает (освобождает) мьютекс когда семафор обнуляется. Таким образом, все редакторы (потоки) должны иметь один общий мьютекс для получения доступа к принтеру и один общий семафор для учета сколько редакторов (потоков) запущено. Как-то так. |
|||
|
||||
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |