滴水三期 信号量 作业 吃字母 VC6源代码

代码效果:

// 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值