转: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多线程.在第二种 ...
随机推荐
- Assertions
JUnit提供了许多重载的断言方法,这些方法均可以通过"import static org.junit.Assert.*"导入.方法的参数顺序一般都是([失败时打印的字符串消息], ...
- J2EE开发中常用的缓存策略
一.什么是缓存1.Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问2.凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之 ...
- 解决NoSuchMethodError with Spring MutableValues异常问题
今天下午项目启动时,遇到一个异常,导致无法启动: [ 221] ERROR - work.web.context.ContextLoader - Context initialization fail ...
- 第1章 Python介绍
本章将包含Python的介绍,安装以及Python的数据类型及运算符.其中关于数据类型中的字符串.列表.元组和字典后续章节会着重介绍. 1.1 为什么学Python Python是一门简明并强大的面向 ...
- SKViedoNode类
继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架 /System/L ...
- Apache Tomcat8必备知识
Apache Tomcat8必备知识 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs 一.Apache Tomcat 8介绍 Apache Tomcat ...
- uva 12253 - Simple Encryption(dfs)
题目链接:uva 12253 - Simple Encryption 题目大意:给定K1.求一个12位的K2,使得KK21=K2%1012 解题思路:按位枚举,不且借用用高速幂取模推断结果. #inc ...
- mongodb入门教程
title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...
- 美洽SDK
简介 GitHub地址:https://github.com/Meiqia/MeiqiaSDK-Android 开发文档:http://meiqia.com/docs/meiqia-android-s ...
- HTML中常用的列表标签