转: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多线程.在第二种 ...
随机推荐
- 【Python排序搜索基本算法】之Prim算法
Prim算法是实现最简单的最小生成树(MST)算法,适合于稠密图.要实现Prim算法,我们主要关注的是增量的变化,也就是从每个非树顶点到树顶点的最短距离,使得最后生成一棵包括所有顶点的树,并且这棵树的 ...
- max key length is 1000 bytes
ALTER TABLE ad_keyword_brand ADD CONSTRAINT w1 UNIQUE (keyword,adasin,brand,page_position,country,ad ...
- vmware workstation11虚拟机破解版(附安装教程) 32/64位
http://kuai.xunlei.com/d/ru4IAALVJQBesH9U93e?p=20395 vmware workstation 11注册机是一款可以免费生成vmware11.0版本序列 ...
- java Serializable和Externalizable序列化反序列化详解--转
一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...
- 如何为Myeclipse手工添加dtd支持
一.引言 在MyEclipse中开发三大框架的项目时候经常会写一些配置的xml文件,例如:Struts2的struts.xml和Hibernate的hibernate.cfg.xml.Spring的a ...
- Java基础知识强化95:Calendar类之Calendar类的add()和set()方法
1. Calendar的add()和set()方法: public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作 public ...
- Java基础知识强化27:Object类之toString()方法
1. Object类的toString()方法: public String toString():返回该对象的字符串表示 2. 案例演示: (1)Student类: package cn.itc ...
- 大数据笔记07:大数据之Hadoop的HDFS(特点)
1. HDFS的特点: (1)数据冗余,硬件容错 (2)流式的数据访问(写一次读多次,不能直接修改已写入的数据,只能删除之后再去写入) (3)存储大文件 2. HDFS适用性和局限性 适用性:(1)适 ...
- JPush 极光推送 消息推送 实例
简介 官网:https://www.jpush.cn/ 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度 ...
- nyoj 44
//nyoj 44 //和上面一题一样,求子串和,但是代码非常简洁..... 时间复杂度为n #include <iostream> using namespace std; int ma ...