HANDLE hHandle, // handle to object DWORD dwMilliseconds // time-out interval );
DWORD WINAPI ThreadProc1(LPVOID lpParameter) { for(int i=0;i<5;i++) { printf("+++++++++\n"); Sleep(1000); } return 0; } int main(int argc, char* argv[]) { //创建一个新的线程 HANDLE hThread1 = ::CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); //主线程将等待线程1进入已通知状态后才能继续运行;线程1运行完后自动进入已通知状态;也就是说输出5次+++++++++后才弹框; DWORD dwCode = ::WaitForSingleObject(hThread1, INFINITE); MessageBox(0,0,0,0); return 0; }
DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in array CONST HANDLE *lpHandles, // object-handle array BOOL bWaitAll, // wait option DWORD dwMilliseconds // time-out interval );
DWORD WINAPI ThreadProc1(LPVOID lpParameter) { for(int i=0;i<5;i++) { printf("+++++++++\n"); Sleep(1000); } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { for(int i=0;i<3;i++) { printf("---------\n"); Sleep(1000); } return 0; } int main(int argc, char* argv[]) { HANDLE hArray[2]; //创建一个新的线程 HANDLE hThread1 = ::CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); //创建一个新的线程 HANDLE hThread2 = ::CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); hArray[0] = hThread1; hArray[1] = hThread2; DWORD dwCode = ::WaitForMultipleObjects(2, hArray,FALSE,INFINITE); //等到其中一个线程执行完变成已通知状态后弹框; MessageBox(0,0,0,0); return 0; }
HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD BOOL bInitialOwner, // initial owner LPCTSTR lpName // object name );
HANDLE OpenMutex( DWORD dwDesiredAccess, // access BOOL bInheritHandle, // inheritance option LPCTSTR lpName // object name );
进程一: HANDLE g_hMutex = CreateMutex(NULL,FALSE, "XYZ"); 进程二: HANDLE g_hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE, "XYZ"); WaitForSingleObject(g_hMutex,INFINITE); //逻辑代码 ReleaseMutex(g_hMutex); 进程三: HANDLE g_hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE, "XYZ"); WaitForSingleObject(g_hMutex,INFINITE); //逻辑代码 ReleaseMutex(g_hMutex);
#include<windows.h> #include<stdio.h> #include "resource.h" HWND hongbao; HWND zg; HWND wst; HWND smy; CRITICAL_SECTION cs; DWORD num; //zg DWORD WINAPI ThreadProc1( LPVOID lpParameter ){ while(num > 0){ EnterCriticalSection(&cs); //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); TCHAR zgBuffer[10]; memset(zgBuffer, 0, 10); GetWindowText(zg, zgBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); DWORD zgNum; sscanf(zgBuffer, "%d", &zgNum); if(num > 0){ memset(szBuffer, 0, 10); memset(zgBuffer, 0, 10); sprintf(szBuffer, "%d", --num); sprintf(zgBuffer, "%d", ++zgNum); SetWindowText(hongbao, szBuffer); SetWindowText(zg, zgBuffer); } LeaveCriticalSection(&cs); Sleep(10); } return 0; } //wst DWORD WINAPI ThreadProc2( LPVOID lpParameter ){ while(num > 0){ EnterCriticalSection(&cs); //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); TCHAR wstBuffer[10]; memset(wstBuffer, 0, 10); GetWindowText(wst, wstBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); DWORD wstNum; sscanf(wstBuffer, "%d", &wstNum); if(num > 0){ memset(szBuffer, 0, 10); memset(wstBuffer, 0, 10); sprintf(szBuffer, "%d", --num); sprintf(wstBuffer, "%d", ++wstNum); SetWindowText(hongbao, szBuffer); SetWindowText(wst, wstBuffer); } LeaveCriticalSection(&cs); Sleep(10); } return 0; } //smy DWORD WINAPI ThreadProc3( LPVOID lpParameter ){ while(num > 0){ EnterCriticalSection(&cs); //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); TCHAR smyBuffer[10]; memset(smyBuffer, 0, 10); GetWindowText(smy, smyBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); DWORD smyNum; sscanf(smyBuffer, "%d", &smyNum); if(num > 0){ memset(szBuffer, 0, 10); memset(smyBuffer, 0, 10); sprintf(szBuffer, "%d", --num); sprintf(smyBuffer, "%d", ++smyNum); SetWindowText(hongbao, szBuffer); SetWindowText(smy, smyBuffer); } LeaveCriticalSection(&cs); Sleep(10); } return 0; } //线程函数 DWORD WINAPI ThreadProc( LPVOID lpParameter // 给线程传递参数 ){ InitializeCriticalSection(&cs); //创建线程 HANDLE hThread1 = ::CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); HANDLE hThread2 = ::CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); HANDLE hThread3 = ::CreateThread(NULL, 0, ThreadProc3, NULL, 0, NULL); return 0; } //回调函数 BOOL CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_INITDIALOG : hongbao = GetDlgItem(hwndDlg, IDC_HB); zg = GetDlgItem(hwndDlg, TXT_ZG); wst = GetDlgItem(hwndDlg, TXT_WST); smy = GetDlgItem(hwndDlg, TXT_SMY); SetWindowText(zg, TEXT("0")); SetWindowText(wst, TEXT("0")); SetWindowText(smy, TEXT("0")); return TRUE; case WM_COMMAND : switch (LOWORD (wParam)) { case IDC_BTN: //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); //清空输入框 SetWindowText(zg, TEXT("0")); SetWindowText(wst, TEXT("0")); SetWindowText(smy, TEXT("0")); HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); //如果不在其他的地方引用它 关闭句柄 ::CloseHandle(hThread); return TRUE; return FALSE; } break ; case WM_CLOSE: EndDialog(hwndDlg, 0); return TRUE; } return FALSE ; } //程序入口 int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevHinstance, LPSTR lpCmdLine, int nCmdShow ){ //创建对话框窗口 DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DialogProc); return 0; }
#include<windows.h> #include<stdio.h> #include "resource.h" HWND hongbao; HWND zg; HWND wst; HWND smy; HANDLE g_hMutex; DWORD num; //zg DWORD WINAPI ThreadProc1( LPVOID lpParameter ){ while(num > 0){ WaitForSingleObject(g_hMutex,INFINITE); //等待互斥体 //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); TCHAR zgBuffer[10]; memset(zgBuffer, 0, 10); GetWindowText(zg, zgBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); DWORD zgNum; sscanf(zgBuffer, "%d", &zgNum); if(num > 0){ memset(szBuffer, 0, 10); memset(zgBuffer, 0, 10); sprintf(szBuffer, "%d", --num); sprintf(zgBuffer, "%d", ++zgNum); SetWindowText(hongbao, szBuffer); SetWindowText(zg, zgBuffer); } ReleaseMutex(g_hMutex); //释放互斥体 Sleep(10); } return 0; } //wst DWORD WINAPI ThreadProc2( LPVOID lpParameter ){ while(num > 0){ WaitForSingleObject(g_hMutex,INFINITE); //等待互斥体 //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); TCHAR wstBuffer[10]; memset(wstBuffer, 0, 10); GetWindowText(wst, wstBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); DWORD wstNum; sscanf(wstBuffer, "%d", &wstNum); if(num > 0){ memset(szBuffer, 0, 10); memset(wstBuffer, 0, 10); sprintf(szBuffer, "%d", --num); sprintf(wstBuffer, "%d", ++wstNum); SetWindowText(hongbao, szBuffer); SetWindowText(wst, wstBuffer); } ReleaseMutex(g_hMutex); //释放互斥体 Sleep(10); } return 0; } //smy DWORD WINAPI ThreadProc3( LPVOID lpParameter ){ while(num > 0){ WaitForSingleObject(g_hMutex,INFINITE); //等待互斥体 //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); TCHAR smyBuffer[10]; memset(smyBuffer, 0, 10); GetWindowText(smy, smyBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); DWORD smyNum; sscanf(smyBuffer, "%d", &smyNum); if(num > 0){ memset(szBuffer, 0, 10); memset(smyBuffer, 0, 10); sprintf(szBuffer, "%d", --num); sprintf(smyBuffer, "%d", ++smyNum); SetWindowText(hongbao, szBuffer); SetWindowText(smy, smyBuffer); } ReleaseMutex(g_hMutex); //释放互斥体 Sleep(10); } return 0; } //线程函数 DWORD WINAPI ThreadProc( LPVOID lpParameter // 给线程传递参数 ){ g_hMutex = CreateMutex(NULL,FALSE, "XYZ"); //创建互斥体 HANDLE hArray[3]; //创建线程 HANDLE hThread1 = ::CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); HANDLE hThread2 = ::CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); HANDLE hThread3 = ::CreateThread(NULL, 0, ThreadProc3, NULL, 0, NULL); //等待所有线程执行完后关闭互斥体 hArray[0] = hThread1; hArray[1] = hThread2; hArray[2] = hThread3; DWORD dwCode = ::WaitForMultipleObjects(3, hArray,FALSE,INFINITE); ::CloseHandle(g_hMutex); return 0; } //回调函数 BOOL CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_INITDIALOG : hongbao = GetDlgItem(hwndDlg, IDC_HB); zg = GetDlgItem(hwndDlg, TXT_ZG); wst = GetDlgItem(hwndDlg, TXT_WST); smy = GetDlgItem(hwndDlg, TXT_SMY); SetWindowText(zg, TEXT("0")); SetWindowText(wst, TEXT("0")); SetWindowText(smy, TEXT("0")); return TRUE; case WM_COMMAND : switch (LOWORD (wParam)) { case IDC_BTN: //获取文本框内容 TCHAR szBuffer[10]; memset(szBuffer, 0, 10); GetWindowText(hongbao, szBuffer, 10); //字符串转数字 sscanf(szBuffer, "%d", &num); //清空输入框 SetWindowText(zg, TEXT("0")); SetWindowText(wst, TEXT("0")); SetWindowText(smy, TEXT("0")); HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); //如果不在其他的地方引用它 关闭句柄 ::CloseHandle(hThread); return TRUE; return FALSE; } break ; case WM_CLOSE: EndDialog(hwndDlg, 0); return TRUE; } return FALSE ; } //程序入口 int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevHinstance, LPSTR lpCmdLine, int nCmdShow ){ //创建对话框窗口 DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DialogProc); return 0; }
原文:https://www.cnblogs.com/ShiningArmor/p/12132675.html