代码效果:
// Eat_Letter.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include <windows.h>
#include <string.h>
CRITICAL_SECTION cs;
HWND hExeHwnd;
HWND Hwnd_resource;
HWND Hwnd_buffer[2];
HWND Hwnd_EAT[4];
HANDLE hThread[4];
HANDLE hsemaphore_empty;
HANDLE hsemaphore_full;
TCHAR szbuffer[256];
DWORD WINAPI WriteLetter(LPVOID lpParameter)
{
DWORD dwIdex=(DWORD)lpParameter;
TCHAR temp[2];
TCHAR temp_eat[256];
memset(temp_eat,0,256);
int str=0;
while(true)
{
Sleep(100);
WaitForSingleObject(hsemaphore_empty,-1);
for (DWORD i=0;i<2;i++)
{
memset(temp,0,2);
EnterCriticalSection(&cs);
GetWindowText(Hwnd_buffer[i],temp,2);
if (strcmp(temp,"0")!=0)
{
memcpy(&temp_eat[str],&temp[0],2);
str++;
SetWindowText(Hwnd_EAT[dwIdex],temp_eat);
SetWindowText(Hwnd_buffer[i],"0");
LeaveCriticalSection(&cs);
break;
}LeaveCriticalSection(&cs);
}
ReleaseSemaphore(hsemaphore_full,1,NULL);
}
return 0;
}
DWORD WINAPI ReadResource(LPVOID lpParameter)
{
TCHAR arrtemp[2];
TCHAR temp1[2];
GetWindowText(Hwnd_resource,szbuffer,256);
DWORD sz_len=strlen(szbuffer);
for (DWORD i=0;i<sz_len;i++)
{
memset(arrtemp,0,2);
memcpy(arrtemp,&szbuffer[i],1);
WaitForSingleObject(hsemaphore_full,-1);
for (DWORD j=0;j<2;j++)
{
memset(temp1,0,2);
EnterCriticalSection(&cs);
GetWindowText(Hwnd_buffer[j],temp1,2);
if (strcmp(temp1,"0")==0)
{
SetWindowText(Hwnd_buffer[j],arrtemp);
LeaveCriticalSection(&cs);
Sleep(1000);
break;
}
LeaveCriticalSection(&cs);
}
ReleaseSemaphore(hsemaphore_empty,1,NULL);
}
return 0;
}
DWORD WINAPI edit_main_pro(LPVOID lpParameter)
{
hsemaphore_full=CreateSemaphore(NULL,2,2,NULL);
hsemaphore_empty=CreateSemaphore(NULL,0,2,NULL);
InitializeCriticalSection(&cs);
HANDLE hRead_resource=CreateThread(NULL,0,ReadResource,NULL,0,NULL);
hThread[0]=CreateThread(NULL,0,WriteLetter,(void*)0,0,NULL);
hThread[1]=CreateThread(NULL,0,WriteLetter,(void*)1,0,NULL);
hThread[2]=CreateThread(NULL,0,WriteLetter,(void*)2,0,NULL);
hThread[3]=CreateThread(NULL,0,WriteLetter,(void*)3,0,NULL);
return 0;
}
void init_edit()
{
Hwnd_resource=GetDlgItem(hExeHwnd,IDC_EDIT_RESOURCE);
Hwnd_buffer[0]=GetDlgItem(hExeHwnd,IDC_EDIT_BUFFER_A);
Hwnd_buffer[1]=GetDlgItem(hExeHwnd,IDC_EDIT_BUFFER_B);
Hwnd_EAT[0]=GetDlgItem(hExeHwnd,IDC_EDIT_EAT_A);
Hwnd_EAT[1]=GetDlgItem(hExeHwnd,IDC_EDIT_EAT_B);
Hwnd_EAT[2]=GetDlgItem(hExeHwnd,IDC_EDIT_EAT_C);
Hwnd_EAT[3]=GetDlgItem(hExeHwnd,IDC_EDIT_EAT_D);
SetWindowText(Hwnd_resource,"0");
SetWindowText(Hwnd_buffer[0],"0");
SetWindowText(Hwnd_buffer[1],"0");
}
BOOL CALLBACK MAIN_PROC( HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam) // second message parameter )
{
hExeHwnd=hwndDlg;
switch(uMsg)
{
case WM_CLOSE:
EndDialog(hwndDlg,0);
break;
case WM_INITDIALOG :
init_edit();
break;
case WM_COMMAND :
switch(LOWORD(wParam))
{
case IDC_BUTTON_START:
HANDLE hThread_main=CreateThread(NULL,0,edit_main_pro,NULL,0,NULL);
CloseHandle(hThread_main);
break;
}
break;
}
return FALSE;
};
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
DialogBox(hInstance,MAKEINTRESOURCE (IDD_DIALOG_MAIN),NULL,MAIN_PROC);
return 0;
}