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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2015, 21:22   #1
evgovs1991
 
Регистрация: 01.10.2014
Сообщений: 7
По умолчанию Синхронизация мюьтекса

Помогите разобратся почему не выполняется условие во втором 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");
        }
}
//---------------------------------------------------------------------------

Последний раз редактировалось Stilet; 08.11.2015 в 16:03.
evgovs1991 вне форума Ответить с цитированием
Старый 08.11.2015, 10:38   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Само по себе открывание или создание мьютекса синхронизацию НЕ выполняет.
Кроме того, сама логика у вас не правильная - между выполнением OpenMutex и CreateMutex другой поток тоже может создать объект.

Создавайте мьютекс заранее, используя CreateMutex а для синронизации используйте WaitForSingleObject и ReleaseMutex.
waleri вне форума Ответить с цитированием
Старый 08.11.2015, 11:17   #3
evgovs1991
 
Регистрация: 01.10.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Само по себе открывание или создание мьютекса синхронизацию НЕ выполняет.
Кроме того, сама логика у вас не правильная - между выполнением OpenMutex и CreateMutex другой поток тоже может создать объект.

Создавайте мьютекс заранее, используя CreateMutex а для синронизации используйте WaitForSingleObject и ReleaseMutex.
а конкретнее в какой момент создавать?
evgovs1991 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация. Dinarara Помощь студентам 12 10.07.2015 08:28
Синхронизация БД Bright-rider БД в Delphi 3 19.06.2012 07:32
синхронизация perun47 Microsoft Office Excel 0 31.01.2012 22:35
Синхронизация Jakethefish PHP 0 24.08.2011 11:17
Синхронизация kostyan142 Общие вопросы по Java, Java SE, Kotlin 6 13.01.2010 01:39