// 互斥体实战.cpp : Defines the entry point for the application.
//
#include “stdafx.h”
#include <WINDOWS.H>
#include <stdio.h>
#include “resource.h”
HWND hEdit1,hEdit2,hEdit3,hEdit4;
HANDLE hMutex;
CRITICAL_SECTION cs;
DWORD WINAPI GetMoney1(LPVOID lpParameter)
{
TCHAR szBuffer[10];
TCHAR szBuffer2[10];
DWORD Money=0;
DWORD dwMoney=0;
BOOL flag=TRUE;
while(flag)
{
//EnterCriticalSection(&cs);
WaitForSingleObject(hMutex,INFINITE);
GetWindowText(hEdit2,szBuffer,10);
GetWindowText(hEdit1,szBuffer2,10);
sscanf(szBuffer,"%d",&dwMoney);
sscanf(szBuffer2,"%d",&Money);
if(Money!=0)
{
memset(szBuffer,0,10);
memset(szBuffer2,0,10);
sprintf(szBuffer,"%d",++dwMoney);
sprintf(szBuffer2,"%d",--Money);
SetWindowText(hEdit2,szBuffer);
SetWindowText(hEdit1,szBuffer2);
}
else
{
flag=FALSE;
}
//LeaveCriticalSection(&cs);
ReleaseMutex(hMutex);
Sleep(50);
}
return 0;
}
DWORD WINAPI GetMoney2(LPVOID lpParameter)
{
TCHAR szBuffer[10];
TCHAR szBuffer2[10];
DWORD Money=0;
DWORD dwMoney=0;
BOOL flag=TRUE;
while(flag)
{
//EnterCriticalSection(&cs);
WaitForSingleObject(hMutex,INFINITE);
GetWindowText(hEdit3,szBuffer,10);
GetWindowText(hEdit1,szBuffer2,10);
sscanf(szBuffer,"%d",&dwMoney);
sscanf(szBuffer2,"%d",&Money);
if(Money!=0)
{
memset(szBuffer,0,10);
memset(szBuffer2,0,10);
sprintf(szBuffer,"%d",++dwMoney);
sprintf(szBuffer2,"%d",–Money);
SetWindowText(hEdit3,szBuffer);
SetWindowText(hEdit1,szBuffer2);
}else
{
flag=FALSE;
}
//LeaveCriticalSection(&cs);
ReleaseMutex(hMutex);
Sleep(50);
}
return 0;
}
DWORD WINAPI GetMoney3(LPVOID lpParameter)
{
TCHAR szBuffer[10];
TCHAR szBuffer2[10];
DWORD Money=0;
DWORD dwMoney=0;
BOOL flag=TRUE;
while(flag)
{
//EnterCriticalSection(&cs);
WaitForSingleObject(hMutex,INFINITE);
GetWindowText(hEdit4,szBuffer,10);
GetWindowText(hEdit1,szBuffer2,10);
sscanf(szBuffer,"%d",&dwMoney);
sscanf(szBuffer2,"%d",&Money);
if(Money!=0)
{
memset(szBuffer,0,10);
memset(szBuffer2,0,10);
sprintf(szBuffer,"%d",++dwMoney);
sprintf(szBuffer2,"%d",–Money);
SetWindowText(hEdit4,szBuffer);
SetWindowText(hEdit1,szBuffer2);
}
else
{
flag =FALSE;
}
//LeaveCriticalSection(&cs);
ReleaseMutex(hMutex);
Sleep(50);
}
return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
hMutex= CreateMutex( NULL,FALSE, NULL);
HANDLE hThreads[3];
hThreads[0]= CreateThread(NULL,0,GetMoney1,NULL,NULL,NULL);
hThreads[1]=CreateThread(NULL,0,GetMoney2,NULL,NULL,NULL);
hThreads[2]=CreateThread(NULL,0,GetMoney3,NULL,NULL,NULL);
//HANDLE hThread2 = CreateThread(NULL,0,GetMoney2,NULL,NULL,NULL);
// HANDLE hThread3 = CreateThread(NULL,0,GetMoney3,NULL,NULL,NULL);
WaitForMultipleObjects(3,hThreads,TRUE,INFINITE);
//些自己用来释放资源的代码
CloseHandle(hThreads[0]);
CloseHandle(hThreads[1]);
CloseHandle(hThreads[2]);
CloseHandle(hMutex);
return 0;
}
BOOL CALLBACK MainDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
EndDialog(hDlg,0);
return TRUE;
case WM_INITDIALOG:
{
hEdit1 = GetDlgItem(hDlg,IDC_EDIT1);
hEdit2 = GetDlgItem(hDlg,IDC_EDIT2);
hEdit3 = GetDlgItem(hDlg,IDC_EDIT3);
hEdit4 = GetDlgItem(hDlg,IDC_EDIT4);
SetWindowText(hEdit1,“0”);
SetWindowText(hEdit2,“0”);
SetWindowText(hEdit3,“0”);
SetWindowText(hEdit4,“0”);
return TRUE;
}
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BUTTON1:
{
TCHAR szBuff[10];
memset(szBuff,0,10);
GetWindowText(hEdit1,szBuff,10);
SetWindowText(hEdit1,szBuff);
SetWindowText(hEdit2,“0”);
SetWindowText(hEdit3,“0”);
SetWindowText(hEdit4,“0”);
CreateThread(NULL,0,ThreadProc1,NULL,NULL,NULL);
//WaitForSingleObject(hThread,INFINITE);
return TRUE;
}
}
break;
}
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
InitializeCriticalSection(&cs);
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,MainDlgProc);
return 0;
}
结束: