HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName
);
HANDLE OpenSemaphore(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
CloseHandle()
#include <windows.h> #include <stdio.h> #include "resource.h" HANDLE hSemaphore; HANDLE hThread[3]; HWND hEditSet; HWND hEdit1; HWND hEdit2; HWND hEdit3; DWORD WINAPI ThreadProc1(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwTimmer=0; WaitForSingleObject(hSemaphore, INFINITE); while(dwTimmer<100) { Sleep(100); memset(szBuffer,0,10); GetWindowText(hEdit1,szBuffer,10); sscanf( szBuffer, "%d", &dwTimmer ); dwTimmer++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwTimmer); SetWindowText(hEdit1,szBuffer); } ReleaseSemaphore(hSemaphore, 1, NULL); return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwTimmer=0; WaitForSingleObject(hSemaphore, INFINITE); while(dwTimmer<100) { Sleep(100); memset(szBuffer,0,10); GetWindowText(hEdit2,szBuffer,10); sscanf( szBuffer, "%d", &dwTimmer ); dwTimmer++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwTimmer); SetWindowText(hEdit2,szBuffer); } ReleaseSemaphore(hSemaphore, 1, NULL); return 0; } DWORD WINAPI ThreadProc3(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwTimmer=0; WaitForSingleObject(hSemaphore, INFINITE); while(dwTimmer<100) { Sleep(100); memset(szBuffer,0,10); GetWindowText(hEdit3,szBuffer,10); sscanf( szBuffer, "%d", &dwTimmer ); dwTimmer++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwTimmer); SetWindowText(hEdit3,szBuffer); } ReleaseSemaphore(hSemaphore, 1, NULL); return 0; } DWORD WINAPI ThreadBegin(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwMoney=0; hSemaphore = CreateSemaphore(NULL,0,3,NULL); //初始信号量为0,最大信号量为3 hThread[0] = ::CreateThread(NULL, 0, ThreadProc1,NULL, 0, NULL); hThread[1] = ::CreateThread(NULL, 0, ThreadProc2,NULL, 0, NULL); hThread[2] = ::CreateThread(NULL, 0, ThreadProc3,NULL, 0, NULL); while(dwMoney<1000) { memset(szBuffer,0,10); GetWindowText(hEditSet,szBuffer,10); sscanf( szBuffer, "%d", &dwMoney ); dwMoney++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwMoney); SetWindowText(hEditSet,szBuffer); } ReleaseSemaphore(hSemaphore, 2, NULL); //释放2个信号量;可以使等待hSemaphore的2个线程开始运行; ::WaitForMultipleObjects(3, hThread,TRUE,INFINITE); //当3个线程运行完后会自动进入已通知状态,此时关闭信号量 ::CloseHandle(hSemaphore); return 0; } BOOL CALLBACK MainDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { BOOL bRet = FALSE; switch(uMsg) { case WM_CLOSE: { EndDialog(hDlg,0); break; } case WM_INITDIALOG: { hEditSet = GetDlgItem(hDlg,IDC_EDIT1); hEdit1 = GetDlgItem(hDlg,IDC_EDIT2); hEdit2 = GetDlgItem(hDlg,IDC_EDIT3); hEdit3 = GetDlgItem(hDlg,IDC_EDIT4); SetWindowText(hEditSet,"0"); SetWindowText(hEdit1,"0"); SetWindowText(hEdit2,"0"); SetWindowText(hEdit3,"0"); break; } case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_BUTTON1: { CreateThread(NULL, 0, ThreadBegin,NULL, 0, NULL); return TRUE; } } break ; } return bRet; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,MainDlgProc); return 0; }
原文:https://www.cnblogs.com/ShiningArmor/p/12148926.html