zoukankan      html  css  js  c++  java
  • 信号量作业 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;
    }
  • 相关阅读:
    第二篇:如何在IIS上启用HTTP压缩
    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its 错误解决办法
    linux字符集查看与设置
    MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
    SELinux状态修改
    zabbix server is not running解决办法
    mysql存储过程之事务篇
    mysql时间相减的问题
    MySql存储过程及MySql常用流程控制语法
    shell 字符串处理汇总(查找,替换等等)
  • 原文地址:https://www.cnblogs.com/ganxiang/p/13297396.html
Copyright © 2011-2022 走看看