// Test_ThreadDlg.cpp : fichier d'implémentation
//

#include "stdafx.h"
#include "Test_Thread.h"
#include "Test_ThreadDlg.h"
#include <iostream>
#include "afxmt.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif



HANDLE Mutex,Thread_Inc,Thread_Dec;
int Compteur;

CMutex Verrou(FALSE, NULL, NULL);


static UINT Inc(int * Cpt)
{
	for(;;){
		std::cout<<"Thread Incrémentation bloqué\n";
		WaitForSingleObject(Mutex,INFINITE);
		(*Cpt)++;
		Sleep(2000);
		ReleaseMutex(Mutex);
		std::cout<<"Incrémentation OK\n";
	}
	return 0;
}

static UINT Dec(int * Cpt)
{
//	for(;;){
		std::cout<<"Thread Décrémentation bloqué\n";
		Verrou.Lock();

		(*Cpt)--;
		Sleep(2000);
		Verrou.Unlock();
		std::cout<<"Décrémentation OK\n";
//	}
	return 0;
}


// Boîte de dialogue CTest_ThreadDlg

CTest_ThreadDlg::CTest_ThreadDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTest_ThreadDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTest_ThreadDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, Compteur);
}

BEGIN_MESSAGE_MAP(CTest_ThreadDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
	ON_WM_SIZE()
#endif
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON1, &CTest_ThreadDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CTest_ThreadDlg::OnBnClickedButton2)
	ON_WM_TIMER()
END_MESSAGE_MAP()


// Gestionnaires de messages pour CTest_ThreadDlg

BOOL CTest_ThreadDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Définir l'icône de cette boîte de dialogue. L'infrastructure effectue cela automatiquement
	//  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
	SetIcon(m_hIcon, TRUE);			// Définir une grande icône
	SetIcon(m_hIcon, FALSE);		// Définir une petite icône

	// TODO : ajoutez ici une initialisation supplémentaire
	SetTimer(1,1000,NULL);
	Mutex = CreateMutex(NULL,TRUE,NULL);
	Compteur = 0;
	Sleep(1); // Pour être sur que ce soit le Tread qui soit bloqué sur le Mutex
	Thread_Inc=AfxBeginThread((AFX_THREADPROC) Inc, &Compteur);

	return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
}

#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CTest_ThreadDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
	if (AfxIsDRAEnabled())
	{
		DRA::RelayoutDialog(
			AfxGetResourceHandle(), 
			this->m_hWnd, 
			DRA::GetDisplayMode() != DRA::Portrait ? 
			MAKEINTRESOURCE(IDD_TEST_THREAD_DIALOG_WIDE) : 
			MAKEINTRESOURCE(IDD_TEST_THREAD_DIALOG));
	}
}
#endif


void CTest_ThreadDlg::OnBnClickedButton1()
{
	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
	//Thread_Inc=AfxBeginThread((AFX_THREADPROC) Inc, &Compteur);

	//Sleep(1); // Pour être sur que ce soit le Tread qui soit bloqué sur le Mutex
	ReleaseMutex(Mutex);

	std::cout<<"Affichage bloqué\n";
	WaitForSingleObject(Mutex,INFINITE);

	//UpdateData(FALSE);

	std::cout<<"Raffraichissement OK\n";
}

void CTest_ThreadDlg::OnBnClickedButton2()
{
	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
	Thread_Dec=AfxBeginThread((AFX_THREADPROC) Dec, &Compteur);

	Sleep(1); // Pour être sur que ce soit le Tread qui soit bloqué sur le Mutex
	Verrou.Unlock();

	std::cout<<"Affichage bloqué\n";
	Verrou.Lock();

	//UpdateData(FALSE);

	std::cout<<"Raffraichissement OK\n";
}



void CTest_ThreadDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO : ajoutez ici le code de votre gestionnaire de messages et/ou les paramètres par défaut des appels
	UpdateData(FALSE);
	CDialog::OnTimer(nIDEvent);
}
