转:MFC创建多线程实例
作者:http://blog.csdn.net/wangningyu/article/details/4404134
平时在MFC里使用多线程时其实是很方面的,因为微软提供了一个API让我们很方面的去创建线程:下面是MSDN中关于CreateThread的函数原型:
1、函数原型声明:
- CreateThread
- The CreateThread function creates a thread to execute within the virtual address space of the calling process.
- To create a thread that runs in the virtual address space of another process, use the CreateRemoteThread function.
- HANDLE CreateThread(
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- SIZE_T dwStackSize,
- LPTHREAD_START_ROUTINE lpStartAddress,
- LPVOID lpParameter,
- DWORD dwCreationFlags,
- LPDWORD lpThreadId
- );
2、参数说明:
- lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
- dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
- lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
- DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
- lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。
- dwCreationFlags :线程标志,可取值如下
- CREATE_SUSPENDED: 创建一个挂起的线程
- 0 :创建后立即激活。
- lpThreadId:保存新线程的id。
3、返回值:
函数成功,返回线程句柄;函数失败返回false。
4、实例代码:
A、新建一个对话框工程为MFC,在MFCDlg.h添加两个成员函数,注意一定要是静态的,代码如下:
- /////////////////////////////////////////////////////////////////////////////
- // CMFCDlg dialog
- class CMFCDlg : public CDialog
- {
- // Construction
- public:
- CMFCDlg(CWnd* pParent = NULL); // standard constructor
- // 线程B1、B2函数
- static DWORD WINAPI ThreadB1(LPVOID lpParam);
- static DWORD WINAPI ThreadB2(LPVOID lpParam);
- ......
- }
B、在cpp文件中实现函数,添加代码如下:
- DWORD WINAPI CMFCDlg::ThreadB1(LPVOID lpParam)
- {
- // 定义结构对象
- PROCESS_INFORMATION pi;
- STARTUPINFO si;
- BOOL bRet;
- // 申请空间
- ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
- ZeroMemory(&si,sizeof(STARTUPINFO));
- // 设置进程启动属性
- si.cb = sizeof(STARTUPINFO);
- si.lpReserved = NULL;
- si.lpDesktop = NULL;
- si.lpTitle = NULL;
- si.dwFlags = STARTF_USESHOWWINDOW;
- si.wShowWindow = SW_SHOWNORMAL;
- si.cbReserved2 = NULL;
- si.lpReserved2 = NULL;
- bRet = CreateProcess(_T("C://Program Files//Internet Explorer//IEXPLORE.exe"),
- _T("http://www.coderfans.cn"),
- NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
- return 0;
- }
- DWORD WINAPI CMFCDlg::ThreadB2(LPVOID lpParam)
- {
- // 定义结构对象
- PROCESS_INFORMATION pi;
- STARTUPINFO si;
- BOOL bRet;
- // 申请空间
- ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
- ZeroMemory(&si,sizeof(STARTUPINFO));
- // 设置进程启动属性
- si.cb = sizeof(STARTUPINFO);
- si.lpReserved = NULL;
- si.lpDesktop = NULL;
- si.lpTitle = NULL;
- si.dwFlags = STARTF_USESHOWWINDOW;
- si.wShowWindow = SW_SHOWNORMAL;
- si.cbReserved2 = NULL;
- si.lpReserved2 = NULL;
- bRet = CreateProcess(_T("C://Program Files//Internet Explorer//IEXPLORE.exe"),
- _T("http://blog.csdn.net/wangningyu"),
- NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
- return 0;
- }
C、然后在对话框初始化时创建进程即可,代码如下:
- BOOL CMFCDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- ......
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
- // TODO: Add extra initialization here
- DWORD dw1,dw2;
- CreateThread(NULL,0,ThreadB1,NULL,0,&dw1);
- Sleep(100);
- CreateThread(NULL,0,ThreadB2,NULL,0,&dw2);
- Sleep(100);
- return TRUE; // return TRUE unless you set the focus to a control
- }
5、MFC创建多线程完成,就这么简单咯!
转:MFC创建多线程实例的更多相关文章
- 转:MFC中创建多线程
MFC中创建多线程 MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员 ...
- MFC中创建多线程
1. 列举几种进程的同步机制,并比较其优缺点. 原子操作 信号量机制 自旋锁 管程,会合,分布式系统 2. 进程之间通信的途径 共享存储系统 消息传递系统 ...
- 【原创】Kafka Consumer多线程实例
Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...
- Java多线程开发系列之二:如何创建多线程
前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等. 在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程. 在Java中创建多线程的方式有 ...
- Linux多线程实例练习 - pthread_create()
Linux多线程实例练习 pthread_create():创建一个线程 int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, ...
- java创建多线程(转载)
转载自:Java创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对 ...
- Java多线程-实例解析
Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...
- Java Tread多线程(0)一个简单的多线程实例
作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...
- 【原创】Kafka Consumer多线程实例续篇
在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...
随机推荐
- MYSQL转MSSQL
SSMA 2008 for MySQL 1.0.exe SSMA 2008 for MySQL 1.0 Extension Pack.exe mysql-connector-odbc-5.1.11-w ...
- tcp/ip状态图
开启一个连接需要三次握手,终止一个tcp连接需要4次握手,对应的客户端和服务器连接状态也随之而改变. 1.服务器出现大量的CLOSE_WAIT? 通常,CLOSE_WAIT 状态在服务器停留时间很短, ...
- 【.NET跨平台】mac上安装VS for mac步骤详解
安装过程中提示以下内容 提示原文如下 It was not possible to complete an automatic installation. This might be due to a ...
- bt5全称是Back Track five,是继BT3,BT4之后的最新版,这是一个linux环境的便携系统,可以放到U盘或者硬盘中启动,对本身硬盘没有影响,无需在本地安装。
是圈内非常著名的黑客攻击平台,是一个封装好的Linux操作系统,内置大量的网络安全检测工具以及黑客破解软件等. Back Track因可以方便的破解无线网络而出名,其中内置的spoonwep2是一个非 ...
- 微信公众账号【iOSDevTip】推出新栏目【看大牛】
首先你须要关注微信公众账号[iOSDevTip] 基于微信公众平台数据分析.非常easy发现.移动端project师都喜欢关注互联网创业资讯.都说.一个不关注互联网创业的iOS开发不是一个合格的互联网 ...
- cocos2d-x精灵移动的方法
1.飞机发射子弹型 想要实现子弹的的飞行效果,又不想在每帧Update里计算位置,最好的方法调用CCMoveTo 例在发射子弹的时机,能够ccTouchBegan时: CCMoveTo* move = ...
- C#中hashtable的赋值、取值、遍历、排序操作
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...
- RDF Database和NoSql DB
一篇比较老的文章,介绍了RDF Database和其他一些分类的NoSql DB http://blog.datagraph.org/2010/04/rdf-nosql-diff
- 大数据笔记02:大数据之Hadoop的生态系统和版本
1.Hadoop的生态系统: (1)图1: (2)图2: 图1 和 图2 都是形象说明了Hadoop的生态圈. 2.举例介绍Hadoop生态圈的小工具: (1)Hive工具(中文意思:小蜜蜂) 利用H ...
- 监听视图树 OnGlobalLayoutListener
背景 我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例: 首先我们写一个控件 public class MyImageView extends ImageView ...