Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Синхронизация мьютекс


Автор: evgovs1991 7.11.2015, 21:19
Помогите разобратся почему не выполняется условие  во втором Timer2?
Принцип работы приложения такой: запускаем первое начинают работать часы...затем запускаем второе...часы там не работают так как запущены в перво приложении. Как только нажимаю кнопку в первом,часы останавливаются и начинают работать часы во втором.
Идея моя такая: Когда открывается форма на событие on create() создаётся мьютекс если он уже создан то ничего не происходит. Установлен второй таймер который работает всегда и проверяет есть ли мьютекс или нет. По нажатию на кнопку останавливаются часы, удаляется мьютекс.
Код



#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
int s=0;
int m=0;
int h=0;
int x=0;
HANDLE H;
HANDLE hx;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
   Panel3->Caption=s;
   Panel2->Caption=m;
   Panel1->Caption=h;
   s++;
   if(s==60) {m++; s=0;}
   if(m==60) {h++; m=0;}
   if(h==24)  h=0;

}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
    Timer1->Enabled=false;
    ReleaseMutex(H);
    CloseHandle(H); // удаляем мьютекс , а не освобождаем его
    Sleep(3000);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer2Timer(TObject *Sender)
{

        if (OpenMutex(SYNCHRONIZE, true, "MyMutex")) // есть? Значит, другое приложение открыло диалог
        {
                Panel4->Caption=x;
                x++;
        }
        else{
            H=CreateMutex(NULL, true, "MyMutex");
            Timer1->Enabled=true;
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormCreate(TObject *Sender)
{
    if(OpenMutex(SYNCHRONIZE, true, "MyMutex"))
        {
            Timer1->Enabled=false;;
        }
    else{
        H=CreateMutex(NULL, true, "MyMutex");
        }
}
//---------------------------------------------------------------------------

Автор: xvr 9.11.2015, 12:57
OpenMutex возвращает HANDLE, который надо закрывать. Иначе mutex не удалится, т.к. будет куча дубликатов HANDLE'ов, которые на него смотрят (из другого приложения после OpenMutex)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)