Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2015, 07:45   #1
evgovs1991
 
Регистрация: 01.10.2014
Сообщений: 7
По умолчанию Мьютекс и синхронизация (с++ builder)

Создал VCL приложение в С++Builder. На нем лежит кнопка вызывающая диалог печати. Вопрос такой как сделать чтобы если запущены несколько копий приложения и в одном из них открыт диалог печати, то в остальных копиях диалог печати не открывается и выдается сообщение о том, что принтер занят, а для синхронизации использовать мьютекс обязательно.
evgovs1991 вне форума Ответить с цитированием
Старый 01.11.2015, 08:14   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Были попытки самостоятельного решения?
И, если, конечно, не секрет, на сколько ещё ресурсов, кроме соседнего форума и RU.SO Вы запостили это задание?
Streletz вне форума Ответить с цитированием
Старый 01.11.2015, 08:28   #3
evgovs1991
 
Регистрация: 01.10.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Были попытки самостоятельного решения?
И, если, конечно, не секрет, на сколько ещё ресурсов, кроме соседнего форума и RU.SO Вы запостили это задание?
еще на два форума....
создавал мьютекс
Код:
 
if(OpenMutex(SYNCHRONIZE, true, "MyMutex"))
		{
			ShowMessage("Уже имеется выполняемое приложение");
		}
		else{
		CreateMutex(NULL, true, "MyMutex");
		int Res = GetLastError( );
		if(Res == ERROR_INVALID_HANDLE)
		{
			ShowMessage("Ошибка в имени 'MyMutex' ");
			Application->Terminate( );
		}
а потом пытался так закрыть диалог
Код:
void __fastcall TForm1::Gtx1Click(TObject *Sender)
{
	DWORD Result;
	hx=OpenMutex(SYNCHRONIZE, true, "MyMutex");
	Result=WaitForSingleObject(hx,INFINITE);
	if(Result==WAIT_OBJECT_0) PrintDialog1->Execute();


}
//---------------------------------------------------------------------------


void __fastcall TForm1::PrintDialog1Close(TObject *Sender)
{
   	ReleaseMutex(hx);
}
evgovs1991 вне форума Ответить с цитированием
Старый 01.11.2015, 10:49   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Что-то Вы явно намудрили. Всё делается проще.
Код:
hMutex = CreateMutex(0, true, (wchar_t*)"NAME");
if (GetLastError() != ERROR_ALREADY_EXISTS) 
{
   /*Диалог печати ещё нигде не открыт. Можно открывать диалог печати*/
}
else 
{
   /*Диалог печати где-то уже открыт. Открывать новый диалог печати нельзя*/
}
Ну и, главное, не забыть потом освободить мьютекс.
Streletz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Межпроцессовый мьютекс 220Volt Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 4 13.06.2015 06:32
Почему не захватывается мьютекс? TwiX Win Api 2 02.01.2014 03:10
Распараллелить выполнение задачи и осуществить синхронизация подзадач по сети. UDP. [C++ Builder] Radisson Фриланс 1 12.01.2012 04:51
Внутрибиблиотечный мьютекс или флаг. Alex Cones Общие вопросы Delphi 5 02.02.2011 21:24
Объекты ожидания в Delphi. Мьютекс, Семафор и Критические секции. OlgaZN Помощь студентам 2 11.06.2010 12:01