日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

WIN32多线程抢红包练习

發布時間:2025/3/21 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WIN32多线程抢红包练习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一個文本框是獎池,右面三個文本框是三個線程搶到的紅包數,程序運行結果如下:

解決資源搶占問題,WIN32提供兩種方式:臨界區和互斥體。

臨界區和互斥體的對比:
1、臨界區只能應用于單個進程間的線程控制,互斥體可以跨進程;
2、互斥體可以設定阻塞等待超時,臨界區不能;
3、線程意外終結時,互斥體可以避免死鎖;
4、互斥體效率比臨界區低。

臨界區實現

// RedPack.cpp : Defines the entry point for the application. //#include "stdafx.h"/************************************************************************/ /* 搶紅包多線程練習 */ /************************************************************************/#include <WINDOWS.H> #include <STDIO.H> #include <TCHAR.H> #include "resource.h"HWND hEditTotal, hEditA, hEditB, hEditC; CRITICAL_SECTION csTotal;DWORD WINAPI ThreadA(LPVOID p) {int nTotal;int nValue;TCHAR szBuffer[100];BOOL bFlag = TRUE;while (bFlag){ EnterCriticalSection(&csTotal);GetWindowText(hEditTotal, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nTotal);GetWindowText(hEditA, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nValue); if (nTotal >= 50){nTotal -= 50;nValue += 50;}else{bFlag = FALSE;} _stprintf(szBuffer, TEXT("%d"), nTotal);SetWindowText(hEditTotal, szBuffer);_stprintf(szBuffer, TEXT("%d"), nValue);SetWindowText(hEditA, szBuffer);LeaveCriticalSection(&csTotal); // 延遲Sleep(50);} return 0; }DWORD WINAPI ThreadB(LPVOID p) {int nTotal;int nValue;TCHAR szBuffer[100];BOOL bFlag = TRUE;while (bFlag){ EnterCriticalSection(&csTotal);GetWindowText(hEditTotal, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nTotal);GetWindowText(hEditB, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nValue); if (nTotal >= 50){nTotal -= 50;nValue += 50;}else{bFlag = FALSE;} _stprintf(szBuffer, TEXT("%d"), nTotal);SetWindowText(hEditTotal, szBuffer);_stprintf(szBuffer, TEXT("%d"), nValue);SetWindowText(hEditB, szBuffer);LeaveCriticalSection(&csTotal); // 延遲Sleep(50);} return 0; }DWORD WINAPI ThreadC(LPVOID p) {int nTotal;int nValue;TCHAR szBuffer[100];BOOL bFlag = TRUE;while (bFlag){ EnterCriticalSection(&csTotal);GetWindowText(hEditTotal, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nTotal);GetWindowText(hEditC, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nValue); if (nTotal >= 50){nTotal -= 50;nValue += 50;}else{bFlag = FALSE;} _stprintf(szBuffer, TEXT("%d"), nTotal);SetWindowText(hEditTotal, szBuffer);_stprintf(szBuffer, TEXT("%d"), nValue);SetWindowText(hEditC, szBuffer);LeaveCriticalSection(&csTotal); // 延遲Sleep(50);} return 0; }// 啟動抽獎線程,設置該線程的目的是阻塞等待其他線程結束,然后清理句柄 DWORD WINAPI ThreadStart(LPVOID p) {HANDLE handles[3];SetWindowText(hEditA, TEXT("0"));SetWindowText(hEditB, TEXT("0"));SetWindowText(hEditC, TEXT("0"));handles[0] = CreateThread(0,0,ThreadA,0,0,0);handles[1] = CreateThread(0,0,ThreadB,0,0,0);handles[2] = CreateThread(0,0,ThreadC,0,0,0);WaitForMultipleObjects(3, handles, TRUE, INFINITE);CloseHandle(handles[0]);CloseHandle(handles[1]);CloseHandle(handles[2]);return 0; }BOOL CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch(uMsg){case WM_INITDIALOG:{ hEditTotal = GetDlgItem(hDlg, IDC_EDIT_TOTAL);hEditA = GetDlgItem(hDlg, IDC_EDIT_A);hEditB = GetDlgItem(hDlg, IDC_EDIT_B);hEditC = GetDlgItem(hDlg, IDC_EDIT_C);SetWindowText(hEditTotal, TEXT("0"));SetWindowText(hEditA, TEXT("0"));SetWindowText(hEditB, TEXT("0"));SetWindowText(hEditC, TEXT("0"));return TRUE;}case WM_COMMAND:{switch(LOWORD(wParam)){case IDC_BUTTON1:{CreateThread(0,0,ThreadStart,0,0,0);return TRUE;}}return TRUE;}case WM_CLOSE:{EndDialog(hDlg, 0);return TRUE;}}return FALSE; }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {InitializeCriticalSection(&csTotal); DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDlgProc);return 0; }

互斥體實現

// RedPack.cpp : Defines the entry point for the application. //#include "stdafx.h"/************************************************************************/ /* 搶紅包多線程練習 */ /************************************************************************/#include <WINDOWS.H> #include <STDIO.H> #include <TCHAR.H> #include "resource.h"HWND hEditTotal, hEditA, hEditB, hEditC; HANDLE hMutex;DWORD WINAPI ThreadA(LPVOID p) {int nTotal;int nValue;TCHAR szBuffer[100];BOOL bFlag = TRUE;while (bFlag){ WaitForSingleObject(hMutex, INFINITE);GetWindowText(hEditTotal, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nTotal);GetWindowText(hEditA, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nValue); if (nTotal >= 50){nTotal -= 50;nValue += 50;}else{bFlag = FALSE;} _stprintf(szBuffer, TEXT("%d"), nTotal);SetWindowText(hEditTotal, szBuffer);_stprintf(szBuffer, TEXT("%d"), nValue);SetWindowText(hEditA, szBuffer);ReleaseMutex(hMutex);// 延遲Sleep(50);} return 0; }DWORD WINAPI ThreadB(LPVOID p) {int nTotal;int nValue;TCHAR szBuffer[100];BOOL bFlag = TRUE;while (bFlag){ WaitForSingleObject(hMutex, INFINITE);GetWindowText(hEditTotal, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nTotal);GetWindowText(hEditB, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nValue); if (nTotal >= 50){nTotal -= 50;nValue += 50;}else{bFlag = FALSE;} _stprintf(szBuffer, TEXT("%d"), nTotal);SetWindowText(hEditTotal, szBuffer);_stprintf(szBuffer, TEXT("%d"), nValue);SetWindowText(hEditB, szBuffer);ReleaseMutex(hMutex);// 延遲Sleep(50);} return 0; }DWORD WINAPI ThreadC(LPVOID p) {int nTotal;int nValue;TCHAR szBuffer[100];BOOL bFlag = TRUE;while (bFlag){ WaitForSingleObject(hMutex, INFINITE);GetWindowText(hEditTotal, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nTotal);GetWindowText(hEditC, szBuffer, 100);_stscanf(szBuffer, TEXT("%d"), &nValue); if (nTotal >= 50){nTotal -= 50;nValue += 50;}else{bFlag = FALSE;} _stprintf(szBuffer, TEXT("%d"), nTotal);SetWindowText(hEditTotal, szBuffer);_stprintf(szBuffer, TEXT("%d"), nValue);SetWindowText(hEditC, szBuffer);ReleaseMutex(hMutex);// 延遲Sleep(50);} return 0; }// 啟動抽獎線程,設置該線程的目的是阻塞等待其他線程結束,然后清理句柄 DWORD WINAPI ThreadStart(LPVOID p) {HANDLE handles[3];hMutex = CreateMutex(0, FALSE, "MyTag");SetWindowText(hEditA, TEXT("0"));SetWindowText(hEditB, TEXT("0"));SetWindowText(hEditC, TEXT("0"));handles[0] = CreateThread(0,0,ThreadA,0,0,0);handles[1] = CreateThread(0,0,ThreadB,0,0,0);handles[2] = CreateThread(0,0,ThreadC,0,0,0);WaitForMultipleObjects(3, handles, TRUE, INFINITE);CloseHandle(handles[0]);CloseHandle(handles[1]);CloseHandle(handles[2]);CloseHandle(hMutex);return 0; }BOOL CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch(uMsg){case WM_INITDIALOG:{ hEditTotal = GetDlgItem(hDlg, IDC_EDIT_TOTAL);hEditA = GetDlgItem(hDlg, IDC_EDIT_A);hEditB = GetDlgItem(hDlg, IDC_EDIT_B);hEditC = GetDlgItem(hDlg, IDC_EDIT_C);SetWindowText(hEditTotal, TEXT("0"));SetWindowText(hEditA, TEXT("0"));SetWindowText(hEditB, TEXT("0"));SetWindowText(hEditC, TEXT("0"));return TRUE;}case WM_COMMAND:{switch(LOWORD(wParam)){case IDC_BUTTON1:{CreateThread(0,0,ThreadStart,0,0,0);return TRUE;}}return TRUE;}case WM_CLOSE:{EndDialog(hDlg, 0);return TRUE;}}return FALSE; }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDlgProc);return 0; }

總結

以上是生活随笔為你收集整理的WIN32多线程抢红包练习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。