信号量作业 Semaphore

// 信号量作业.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;
}
原文地址:https://www.cnblogs.com/ganxiang/p/13297396.html