windows多线程窗口程序设计
掌握windows基于消息驱动的窗口应用程序设计的基本方法,掌握窗口程序资源的概念与设计,掌握常用的消息的程序处理方法,掌握文字图形输出相关函数编程。掌握设计的基本方法(选项),掌握时钟消息设计动画程序(选项)
利用windows基于消息驱动的窗口应用程序设计的基本方法,利用常用的消息程序处理方法,设计一个多线程程序,然后用时钟动画将各线程的执行过程直观的表现出来。
操作环境:安装有Windows操作系统PC机一台,实验环境为VS(任何版本都行).
1.在vs中,生成一个空白的win32项目,了解win32的消息驱动,学习窗口程序资源的概念与设计,并为程序设计一个位图图标。
2. 观察win32程序基本结构,了解常用的消息的程序处理方法,掌握文字图形输出相关函数编程,并练习文字与图形的输出。
3.设计并构建程序用户界面
菜单栏
线程设置对话框
菜单与对话框函数如下:
// 分析菜单选择:
LRESULT
CALLBACK WndProc(HWND
hWnd, UINT
message, WPARAM
wParam, LPARAM
lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
int pausecount;
switch (message)
{
case
WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case
IDM_ABOUT:
switch (DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About))
{
case
IDSTART:
CreateThreadStart(hWnd);
//GetSecurityInfo
break;
case
IDPAUSE:
pausecount=SuspendThread((HANDLE)ThreadId[treatwith]);
pausecount=SuspendThread(ThreadHandle[treatwith]);
if(pausecount==-1)
{
pausecount=GetLastError();
}
break;
case
IDRESET:
pausecount=ResumeThread((HANDLE)ThreadId[treatwith]);
pausecount=ResumeThread(ThreadHandle[treatwith]);
if(pausecount==-1)
{
pausecount=GetLastError();
}
break;
}
break;
case
IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return
DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case
WM_SIZE:
wndWidthSize=LOWORD(lParam);
wndHighSize=HIWORD(lParam);
break;
case
WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//TextOut(hdc,100,50,_T("SOUTH WEST UNIVERSITY"),wcslen(_T("SOUTH WEST UNIVERSITY")));
// TODO: 在此添加任意绘图代码...
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) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDPAUSE)
{
treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDRESET)
{
treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDSTART)
{
threadNum=GetDlgItemInt(hDlg,IDC_EDIT1,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
4.编写多线程创建函数,创建多个线程,编写动画绘图函数绘制图形,每个线程都调用绘图函数,在用户区中绘制动画,以直观表现线程的运行。具体代码如下:
//线程创建
void CreateThreadStart(HWND
hWnd)
{
bool SecurityDescriptorSuc=true;
threadStruct *pthreadparam;
UINT threadXuHao=0;
int i=0;
HANDLE handleRes;
while(threadXuHao<threadNum)
{
pthreadparam=new
threadStruct;//到线程里面去释放
pthreadparam->hWnd=hWnd;
pthreadparam->threadXuHao=threadXuHao;
if(SecurityDescriptorSuc==false)
{
//handleRes=CreateThread(&sa,0,PaintThread,
// (LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);
ThreadHandle[threadXuHao]=handleRes;
}
else
{
handleRes=CreateThread(NULL,0,PaintThread,
(LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);
ThreadHandle[threadXuHao]=handleRes;
}
threadXuHao++;
}
}
//绘图
DWORD
WINAPI PaintThread(LPVOID
lpParam)
{
UINT threadXuHao=((threadStruct*)lpParam)->threadXuHao;
HWND hWnd=((threadStruct*)lpParam)->hWnd;
delete
lpParam;
HDC hdc=GetDC(hWnd);
/*UINT currentHigh=wndHighSize-1;*/
wchar_t str[100];
swprintf(str,_T("this is the %d thread"),threadXuHao);
TextOut(hdc, 50 * (threadXuHao + 1) - 40 , 50 * (threadXuHao + 1) - 40 + (threadXuHao + 1) * 5, str, wcslen(str));
/*UINT rectWidth;
rectWidth=wndWidthSize/threadNum;*/
//HFONT X=CreateHfont
/*HPEN logicPen=CreatePen(PS_SOLID,3,logicColor[threadXuHao]);*/
HPEN logicPen = CreatePen(PS_SOLID, 3, RGB(50 * threadXuHao - 80, 20 * threadXuHao, 10*threadXuHao+150));
HPEN oldPenObj;
RECT rc;
GetClientRect(hWnd, &rc);
int n = 0;
int x=0;
int y = 0;
while (x<wndWidthSize)
{
x = 50 * (threadXuHao + 1) -40+150;
y = 50 * (threadXuHao+1)-40;
/*if (y > wndHighSize)
y -= wndHighSize;*/
int m = 10*(threadXuHao+1);
//MoveToEx(hdc,rectWidth*threadXuHao,currentHigh,NULL);
oldPenObj=(HPEN)SelectObject(hdc,(HGDIOBJ)logicPen);
//LineTo(hdc,(rectWidth-30)*(threadXuHao+1),currentHigh);
Ellipse(hdc, x+n ,y, x + m+n , y+m);
SelectObject(hdc,(HGDIOBJ)oldPenObj);
//currentHigh=currentHigh-3;
n += (threadXuHao + 1) * 5;
Sleep((threadXuHao+1)*200);
}
ReleaseDC(hWnd,hdc);
return 1;
}
五. 实验结果
程序运行结果如下:
其中,进程3被暂停。
windows多线程窗口程序设计的更多相关文章
- Windows多线程多任务设计初步(转)
Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
- windows多线程没那么难
windows多线程没那么难 作者:vpoet mail:vpoet_sir@163.com 上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows 多线程 ...
- Windows多线程编程入门
标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...
- [转]Windows的窗口刷新机制
1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序 ...
- Windows多线程
//简单的引出多线程是肿么回事儿....当点击下载的时候,下载内容还没结束也可以点击资源库,其实这就用了另一个线程,弹出“下载完成”对话框的时候,没有点击确定是不能点击主页面内容的,这就是用----- ...
- 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化
眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- Windows多线程学习随笔
自学Windows多线程知识,例程如下: #include <iostream> #include <windows.h> #include <process.h> ...
随机推荐
- 用layui遇到过的问题
1.报错“layui.form is not a function”问题 把代码中这一串修改一下:form = layui.form(); 括号去掉就行: form = layui.form; 如果你 ...
- Stack栈类与、Queue队列与线性表的区别和联系
栈和队列都属于特殊的线性表 一.定义 1.线性表(linear list): 是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.数据元素是一个抽象的符号,其具体含义在不同的情 ...
- 关于MySQL连接抛出Authentication Failed错误分析
[问题描述] 在应用端,偶尔看到有如下报错: Authentication to host 'xxxx' for user 'yyyy' using method 'mysql_native_pass ...
- javascript数据结构与算法--二叉树(插入节点、生成二叉树)
javascript数据结构与算法-- 插入节点.生成二叉树 二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * ...
- PCA(主成分分析)和LDA详解
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html http://www.c ...
- Netty核心概念(10)之内存管理
1.前言 之前的章节已经将启动demo中能看见的内容都分析完了,Netty的一个整体样貌都在第8节线程模型最后给的图画出来了.这些内容解释了Netty为什么是一个异步事件驱动的程序,也解释了Netty ...
- 程序使用suid应注意的策略
安全要求程序应使用最小权限执行,然而有的程序由于特殊性,往往在执行某段代码的时候需要提高权限. 由于suid的容易使用特性,很多编程人员往往会直接使用它来实现提高权限的功能,而不是去做代码权限分离.这 ...
- Chapter 3 Phenomenon——5
I saw several things simultaneously. 我同时看见了几件事情. Nothing was moving in slow motion,the way it does i ...
- Python开发工具,服务器框架等
python服务器框架:uWSGI WEB服务器.mod_WS.Meinheld.Gunicorn.CherryPy.Bjoern 查看python内部模块命令,内置函数,查看python已经安装的模 ...
- R语言常用包分类总结
常用包: ——数据处理:lubridata ,plyr ,reshape2,stringr,formatR,mcmc: ——机器学习:nnet,rpart,tree,party,lars,boost, ...