// 信号量作业.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <stdio.h>
#include "resource.h"
#include <string.h>
HWND hEdit_in;
HWND hEdit_buff1;
HWND hEdit_buff2;
HWND hEdit_A;
HWND hEdit_B;
HWND hEdit_C;
HWND hEdit_D;
HWND hEditAarray[4];
HWND hBuffAarray[2];
HWND hThreadAarray[4];
//HANDLE hThreadOutArr[4];
HANDLE hSemaphoreArr[4];
HANDLE hspbuff;
HANDLE hSemaphore;
HANDLE hSemaphoreBuff;
HANDLE g_Event;
char szBuffer[MAX_PATH];
char szData[10];
DWORD Len;
int i;
int count = 0;
HANDLE hThreadMain;
int Total;
DWORD ThreadID;
DWORD WINAPI ThreadProcOut(LPVOID lpParameter)
{
DWORD dwEditID = DWORD(lpParameter) % 10;
DWORD dwBuffID = DWORD(lpParameter) / 10;
char szEdit[MAX_PATH];
char szNewEdit[MAX_PATH];
DWORD num = 0;
memset(szEdit,0,MAX_PATH);
memset(szNewEdit,0,MAX_PATH);
while(i < Len)
{
//WaitForSingleObject(hSemaphore,INFINITE);
WaitForSingleObject(hSemaphoreArr[dwBuffID],INFINITE);
Sleep(200);
if(i >= Len)
{
//ReleaseSemaphore(hSemaphoreBuff,1,NULL);
ReleaseSemaphore(hSemaphoreArr[dwBuffID],1,NULL);
break;
}
GetWindowText(hEditAarray[dwEditID],szEdit,MAX_PATH);
GetWindowText(hBuffAarray[dwBuffID],szNewEdit,MAX_PATH);
//strcat(szEdit,szData);
strcat(szEdit,szNewEdit);
SetWindowText(hEditAarray[dwEditID],szEdit);
i++;
num++;
//ReleaseSemaphore(hSemaphore,1,NULL);
//ReleaseSemaphore(hSemaphoreArr[dwBuffID],1,NULL);
ReleaseSemaphore(hSemaphoreBuff,1,NULL);
}
return 0;
}
DWORD WINAPI ThreadProcBuff(LPVOID lpParameter)
{
DWORD dwBuffID = (int)lpParameter;
HANDLE hThreadOutArr[4];
//WaitForSingleObject(g_Event,INFINITE);
//hSemaphore = CreateSemaphore(NULL,0,4,NULL);
hSemaphoreArr[dwBuffID] = CreateSemaphore(NULL,0,4,NULL);
DWORD dwID = DWORD(lpParameter);
hThreadOutArr[0] = CreateThread(NULL,0,ThreadProcOut,(void*)(0 + dwID*10),0,NULL);
hThreadOutArr[1] = CreateThread(NULL,0,ThreadProcOut,(void*)(1 + dwID*10),0,NULL);
hThreadOutArr[2] = CreateThread(NULL,0,ThreadProcOut,(void*)(2 + dwID*10),0,NULL);
hThreadOutArr[3] = CreateThread(NULL,0,ThreadProcOut,(void*)(3 + dwID*10),0,NULL);
while(i < Len)
{
//SetWindowText(hBuffAarray[dwID],"");
WaitForSingleObject(hSemaphoreBuff,INFINITE);
Sleep(200);
memset(szData,0,10);
sprintf(szData,"-%c",szBuffer[i]);
SetWindowText(hBuffAarray[dwID],szData);
count ++;
//ReleaseSemaphore(hSemaphoreBuff,1,NULL);
//ReleaseSemaphore(hSemaphore,1,NULL);
ReleaseSemaphore(hSemaphoreArr[dwBuffID],1,NULL);
}
WaitForMultipleObjects(4,hThreadOutArr,FALSE,INFINITE);
CloseHandle(hThreadOutArr[0]);
CloseHandle(hThreadOutArr[1]);
CloseHandle(hThreadOutArr[2]);
CloseHandle(hThreadOutArr[3]);
CloseHandle(hSemaphoreArr[0]);
CloseHandle(hSemaphoreArr[1]);
//SetEvent(g_Event);
return 0;
}
DWORD WINAPI ThreadProcMain(LPVOID lpParameter)
{
HANDLE hThreadBUFF1 = CreateThread(NULL,0,ThreadProcBuff,(void*)0,0,NULL);
HANDLE hThreadBUFF2 = CreateThread(NULL,0,ThreadProcBuff,(void*)1,0,NULL);
CloseHandle(hThreadBUFF1);
CloseHandle(hThreadBUFF2);
return 0;
}
int CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
{
hEdit_in = GetDlgItem(hwndDlg,IDC_EDIT_IN);
hEdit_buff1 = GetDlgItem(hwndDlg,IDC_EDIT_BUFFER1);
hEdit_buff2 = GetDlgItem(hwndDlg,IDC_EDIT_BUFFER2);
hBuffAarray[0] = hEdit_buff1;
hBuffAarray[1] = hEdit_buff2;
hEdit_A = GetDlgItem(hwndDlg,IDC_EDIT_A);
hEdit_B = GetDlgItem(hwndDlg,IDC_EDIT_B);
hEdit_C = GetDlgItem(hwndDlg,IDC_EDIT_C);
hEdit_D = GetDlgItem(hwndDlg,IDC_EDIT_D);
hEditAarray[0] = hEdit_A;
hEditAarray[1] = hEdit_B;
hEditAarray[2] = hEdit_C;
hEditAarray[3] = hEdit_D;
break;
}
case WM_COMMAND:
{
switch (LOWORD (wParam))
{
case IDC_BUTTON:
{
i = 0;
//SetWindowText(hEdit1,"1000");
//CreateMutex(NULL,FALSE,"XYZ");
Len = GetWindowText(hEdit_in,szBuffer,MAX_PATH);
SetWindowText(hEdit_A,"");
SetWindowText(hEdit_B,"");
SetWindowText(hEdit_C,"");
SetWindowText(hEdit_D,"");
SetWindowText(hEdit_buff1,"");
SetWindowText(hEdit_buff2,"");
g_Event = CreateEvent(NULL,FALSE,TRUE,NULL);
hSemaphoreBuff = CreateSemaphore(NULL,1,2,NULL);
DWORD* tid;
ThreadID = 0;
//HANDLE hThreadMain = CreateThread(NULL,0,ThreadProcMain,NULL,0,NULL);
hThreadMain = CreateThread(NULL,0,ThreadProcMain,NULL,0,&ThreadID);
WaitForSingleObject(hThreadMain,INFINITE);
CloseHandle(hThreadMain);
}
}
break;
}
case WM_CLOSE:
{
EndDialog(hwndDlg,0);
break;
}
}
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,MainDlgProc);
return 0;
}