已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多线程编程示例:具体内容:创建3个线程分别以不同的速率计数,每满100画一个椭圆效果:步骤:visual stdio2010中创建一个win32控制台程序ThreadDomo-取消窗口的最大化按钮-在WM_CREATE消息中创建edit框,static框和3个线程-菜单中添加“暂停”与“启动”-添加相应的“暂停”“启动”消息-添加线程的回调函数进行计算与绘图代码:将原来的ThreadDamo1.cpp的代码都清除/ ThreadDamo1.cpp : 定义应用程序的入口点。/#include stdafx.h#include ThreadDamo1.h#define MAX_LOADSTRING 100HWND ThrhWnd1=NULL;/#线程1的编辑框句柄HWND ThrhWnd2=NULL;HWND ThrhWnd3=NULL;HANDLE ThrHandle1=NULL;/#线程1的线程句柄HANDLE ThrHandle2=NULL;HANDLE ThrHandle3=NULL;int thrCoins1=0;/#线程1的硬币数int thrCoins2=0;int thrCoins3=0;/#DWORD WINAPI ThreadProc1(LPVOID lpParameter);DWORD WINAPI ThreadProc2(LPVOID lpParameter);DWORD WINAPI ThreadProc3(LPVOID lpParameter);/*void DrawCoins(int x,int y,int thrCoins,int);*/?/ 全局变量:HWND hWnd;HMENU hMenu;/#HINSTANCE hInst;/ 当前实例TCHAR szTitleMAX_LOADSTRING;/ 标题栏文本TCHAR szWindowClassMAX_LOADSTRING;/ 主窗口类名/ 此代码模块中包含的函数的前向声明:ATOMMyRegisterClass(HINSTANCE hInstance); /#用于注册窗口类,注册类后才能调用createwindows函数创建窗口BOOLInitInstance(HINSTANCE, int);/#createwindows函数在initinstance函数中调用LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);/#这几个函数都是被winmain函数调用的,winmain函数代表的是gui主线程的入口函数int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine); / TODO: 在此放置代码。MSG msg;HACCEL hAccelTable;/ 初始化全局字符串LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_THREADDAMO1, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);/ 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)return FALSE;hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_THREADDAMO1);/ 主消息循环:while (GetMessage(&msg, NULL, 0, 0)if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)TranslateMessage(&msg);DispatchMessage(&msg);return (int) msg.wParam;/ 函数: MyRegisterClass()/ 目的: 注册窗口类。/ 注释:/ 仅当希望/ 此代码与添加到 Windows 95 中的“RegisterClassEx”/ 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,/ 这样应用程序就可以获得关联的/ “格式正确的”小图标。/ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_THREADDAMO1);wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(CTLCOLOR_BTN+1);/#原本的COLOR_WINDOW改成CTLCOLOR_BTNwcex.lpszMenuName= MAKEINTRESOURCE(IDC_THREADDAMO1);wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL);return RegisterClassEx(&wcex);/ 函数: InitInstance(HINSTANCE, int)/ 目的: 保存实例句柄并创建主窗口/ 注释:/ 在此函数中,我们在全局变量中保存实例句柄并/ 创建和显示主程序窗口。/BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) hInst = hInstance; / 将实例句柄存储在全局变量中 /#这里正用createwindow函数创建窗口 /#去掉最大化按钮的方法 /*#方法1-原本的WS_OVERLAPPEDWINDOW改成WS_OVERLAPPEDWINDOW&WS_MAXIMIZEBOX取消了“最大化” hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW&WS_MAXIMIZEBOX,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE;*/ /#方法2 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; LONG lStyle=GetWindowLong(hWnd,GWL_STYLE);/#GetWindowLong是一个Windows API函数,获得指定窗口的有关信息,也获得在额外窗口内存中指定偏移位地址的32位度整型值。 lStyle &=WS_MAXIMIZEBOX; SetWindowLong(hWnd,GWL_STYLE,lStyle);/#设置窗口的风格 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE;/#HWND CreateEditControlForMainWnd(int x,int y,int nWindth,int nHeight,HWND hWndParent,HINSTANCE hInstance)return CreateWindow(_T(EDIT),_T(0),WS_CHILD|WS_VISIBLE,x,y,nWindth,nHeight,hWndParent,NULL,hInstance,NULL);void CreateStaticForMainWnd(LPCTSTR lpWindowName ,int x,int y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance)CreateWindow(_T(STATIC),lpWindowName,WS_CHILD|WS_VISIBLE,x,y,nWidth,nHeight,hWndParent,NULL,hInstance,NULL);/ 函数: WndProc(HWND, UINT, WPARAM, LPARAM)/ 目的: 处理主窗口的消息。/ WM_COMMAND- 处理应用程序菜单/ WM_PAINT- 绘制主窗口/ WM_DESTROY- 发送退出消息并返回/LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;switch (message)case WM_CREATE:ThrhWnd1 = CreateEditControlForMainWnd(100,300,100,20,hWnd,hInst);ThrhWnd2 = CreateEditControlForMainWnd(300,300,100,20,hWnd,hInst);ThrhWnd3 = CreateEditControlForMainWnd(500,300,100,20,hWnd,hInst);CreateStaticForMainWnd(_T(线程1),100,270,100,20,hWnd,hInst);CreateStaticForMainWnd(_T(线程2),300,270,100,20,hWnd,hInst);CreateStaticForMainWnd(_T(线程3),500,270,100,20,hWnd,hInst);ThrHandle1 = CreateThread(NULL,0,ThreadProc1,NULL,CREATE_SUSPENDED,NULL);/#创建3个线程ThrHandle2 = CreateThread(NULL,0,ThreadProc2,NULL,CREATE_SUSPENDED,NULL);ThrHandle3 = CreateThread(NULL,0,ThreadProc3,NULL,CREATE_SUSPENDED,NULL);hMenu = GetMenu(hWnd);case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);/ 分析菜单选择:switch (wmId)case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;case IDM_RESUME:/#启动的消息事件 EnableMenuItem(hMenu,IDM_SUSPEN,MF_ENABLED);/#这两个函数语句放在resumethread函数后面比较好理解EnableMenuItem(hMenu,IDM_RESUME,MF_GRAYED);DrawMenuBar(hWnd);ResumeThread(ThrHandle1);ResumeThread(ThrHandle2);ResumeThread(ThrHandle3);break;case IDM_SUSPEN:EnableMenuItem(hMenu,IDM_SUSPEN,MF_GRAYED);EnableMenuItem(hMenu,IDM_RESUME,MF_ENABLED);DrawMenuBar(hWnd);SuspendThread(ThrHandle1);SuspendThread(ThrHandle2);SuspendThread(ThrHandle3);break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);/ TODO: 在此添加任意绘图代码./ DrawCoins(100,200,thrCoins1,RGB(255,0,0);/ DrawCoins(300,400,thrCoins1,RGB(0,255,0);/ DrawCoins(500,600,thrCoins1,RGB(0,0,255);EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);return 0;/ “关于”框的消息处理程序。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)UNREFERENCED_PARAMETER(lParam);switch (message)case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) = IDOK | LOWORD(wParam) = IDCANCEL)EndDialog(hDlg, LOWORD(wParam);return (INT_PTR)TRUE;break;return (INT_PTR)FALSE;DWORD WINAPI ThreadProc1(LPVOID lpParameter)TCHAR szBuf10=0;int index = 0;/获得DCHDC hdc = GetDC(hWnd);/创建一个红色的画刷并选到DC中去HBRUSH hBr = CreateSolidBrush(RGB(255,0,0);HBRUSH h01dBR = static_cast (SelectObject(hdc,hBr);for (int i=0;i1000;i+)wsprintf(szBuf,_T(%d),i+1);SetWindowText(ThrhWnd1,szBuf);if (0=i%100)int y=250-10*index;Ellipse(hdc,100,y,200,y-30);index+;thrCoins1=index;Sleep(50);/把旧的画刷选回去,并删除新的画刷SelectObject(hdc,h01dBR);DeleteObject(hBr);/释放DCReleaseDC(hWnd,hdc);return 0;DWORD WINAPI ThreadProc2(LPVOID lpParameter)TCHAR szBuf10=0;int index = 0;/获得DCHDC hdc = GetDC(hWnd);/创建一个红色的画刷并选到DC中去HBRUSH hBr = CreateSolidBrush(RGB(0,255,0);HBRUSH h01dBR = static_cast (Select
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农用杀虫灯使用管理规范
- 会员储值消费管理手册
- 双重预防数字化建设实施方案
- 老人膳食营养搭配服务指南
- 中医舌诊脉诊辨证规范
- 变更管理制度实施细则
- 居家养老防跌倒安全看护方案细则
- 客户服务质量回访跟踪管理制度
- 综合应急演练方案评估报告
- 冷库储藏管理操作规范指引
- 2025中国机械工业集团有限公司审计中心项目主审岗招聘6人笔试历年典型考点题库附带答案详解
- 2026年全国安全生产月主题宣讲课件
- 2026年人教版(新教材)小学信息技术三年级全一册第二学期(第5-8单元)期末质量检测卷及答案(二套)
- 招商运营管理中心工作手册
- 2026年陕西好猫卷烟材料有限责任公司招聘(10人)笔试参考题库及答案解析
- 四川-(2025年)高考四川卷历史高考真题(含答案)
- 部队安全员职责
- 心内科运用PDCA降低心内科住院病人跌倒发生率品管圈成果汇报书
- 施耐德ATS48软启动器使用手册
- LY/T 1000-2013容器育苗技术
- GB/T 30516-2014高粘高弹道路沥青
评论
0/150
提交评论