作者:http://blog.csdn.net/wangningyu/article/details/4404134

平时在MFC里使用多线程时其实是很方面的,因为微软提供了一个API让我们很方面的去创建线程:下面是MSDN中关于CreateThread的函数原型:

1、函数原型声明:

  1. CreateThread
  2. The CreateThread function creates a thread to execute within the virtual address space of the calling process.
  3. To create a thread that runs in the virtual address space of another process, use the CreateRemoteThread function.
  4. HANDLE CreateThread(
  5. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  6. SIZE_T dwStackSize,
  7. LPTHREAD_START_ROUTINE lpStartAddress,
  8. LPVOID lpParameter,
  9. DWORD dwCreationFlags,
  10. LPDWORD lpThreadId
  11. );

2、参数说明:

  1. lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
  2. dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
  3. lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
  4. DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
  5. lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为Nil。
  6. dwCreationFlags :线程标志,可取值如下
  7. CREATE_SUSPENDED: 创建一个挂起的线程
  8. 0 :创建后立即激活。
  9. lpThreadId:保存新线程的id。

3、返回值:

  函数成功,返回线程句柄;函数失败返回false。

4、实例代码:

  A、新建一个对话框工程为MFC,在MFCDlg.h添加两个成员函数,注意一定要是静态的,代码如下:

  1. /////////////////////////////////////////////////////////////////////////////
  2. // CMFCDlg dialog
  3. class CMFCDlg : public CDialog
  4. {
  5. // Construction
  6. public:
  7. CMFCDlg(CWnd* pParent = NULL);  // standard constructor
  8. // 线程B1、B2函数
  9. static DWORD WINAPI ThreadB1(LPVOID lpParam);
  10. static DWORD WINAPI ThreadB2(LPVOID lpParam);
  11. ......
  12. }

  B、在cpp文件中实现函数,添加代码如下:

  1. DWORD WINAPI CMFCDlg::ThreadB1(LPVOID lpParam)
  2. {
  3. // 定义结构对象
  4. PROCESS_INFORMATION pi;
  5. STARTUPINFO         si;
  6. BOOL                bRet;
  7. // 申请空间
  8. ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
  9. ZeroMemory(&si,sizeof(STARTUPINFO));
  10. // 设置进程启动属性
  11. si.cb           =   sizeof(STARTUPINFO);
  12. si.lpReserved   =   NULL;
  13. si.lpDesktop    =   NULL;
  14. si.lpTitle      =   NULL;
  15. si.dwFlags      =   STARTF_USESHOWWINDOW;
  16. si.wShowWindow  =   SW_SHOWNORMAL;
  17. si.cbReserved2  =   NULL;
  18. si.lpReserved2  =   NULL;
  19. bRet = CreateProcess(_T("C://Program Files//Internet Explorer//IEXPLORE.exe"),
  20. _T("http://www.coderfans.cn"),
  21. NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
  22. return 0;
  23. }
  24. DWORD WINAPI CMFCDlg::ThreadB2(LPVOID lpParam)
  25. {
  26. // 定义结构对象
  27. PROCESS_INFORMATION pi;
  28. STARTUPINFO         si;
  29. BOOL                bRet;
  30. // 申请空间
  31. ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
  32. ZeroMemory(&si,sizeof(STARTUPINFO));
  33. // 设置进程启动属性
  34. si.cb           =   sizeof(STARTUPINFO);
  35. si.lpReserved   =   NULL;
  36. si.lpDesktop    =   NULL;
  37. si.lpTitle      =   NULL;
  38. si.dwFlags      =   STARTF_USESHOWWINDOW;
  39. si.wShowWindow  =   SW_SHOWNORMAL;
  40. si.cbReserved2  =   NULL;
  41. si.lpReserved2  =   NULL;
  42. bRet = CreateProcess(_T("C://Program Files//Internet Explorer//IEXPLORE.exe"),
  43. _T("http://blog.csdn.net/wangningyu"),
  44. NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
  45. return 0;
  46. }

  C、然后在对话框初始化时创建进程即可,代码如下:

  1. BOOL CMFCDlg::OnInitDialog()
  2. {
  3. CDialog::OnInitDialog();
  4. ......
  5. // Set the icon for this dialog.  The framework does this automatically
  6. //  when the application's main window is not a dialog
  7. SetIcon(m_hIcon, TRUE);         // Set big icon
  8. SetIcon(m_hIcon, FALSE);        // Set small icon
  9. // TODO: Add extra initialization here
  10. DWORD   dw1,dw2;
  11. CreateThread(NULL,0,ThreadB1,NULL,0,&dw1);
  12. Sleep(100);
  13. CreateThread(NULL,0,ThreadB2,NULL,0,&dw2);
  14. Sleep(100);
  15. return TRUE;  // return TRUE  unless you set the focus to a control
  16. }

5、MFC创建多线程完成,就这么简单咯!

转:MFC创建多线程实例的更多相关文章

  1. 转:MFC中创建多线程

    MFC中创建多线程   MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员 ...

  2. MFC中创建多线程

    1.   列举几种进程的同步机制,并比较其优缺点. 原子操作    信号量机制   自旋锁    管程,会合,分布式系统 2.   进程之间通信的途径 共享存储系统       消息传递系统      ...

  3. 【原创】Kafka Consumer多线程实例

    Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...

  4. Java多线程开发系列之二:如何创建多线程

    前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等. 在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程. 在Java中创建多线程的方式有 ...

  5. Linux多线程实例练习 - pthread_create()

    Linux多线程实例练习 pthread_create():创建一个线程 int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, ...

  6. java创建多线程(转载)

    转载自:Java创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对 ...

  7. Java多线程-实例解析

    Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...

  8. Java Tread多线程(0)一个简单的多线程实例

    作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...

  9. 【原创】Kafka Consumer多线程实例续篇

    在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...

随机推荐

  1. 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 ...

  2. tcp/ip状态图

    开启一个连接需要三次握手,终止一个tcp连接需要4次握手,对应的客户端和服务器连接状态也随之而改变. 1.服务器出现大量的CLOSE_WAIT? 通常,CLOSE_WAIT 状态在服务器停留时间很短, ...

  3. 【.NET跨平台】mac上安装VS for mac步骤详解

    安装过程中提示以下内容 提示原文如下 It was not possible to complete an automatic installation. This might be due to a ...

  4. bt5全称是Back Track five,是继BT3,BT4之后的最新版,这是一个linux环境的便携系统,可以放到U盘或者硬盘中启动,对本身硬盘没有影响,无需在本地安装。

    是圈内非常著名的黑客攻击平台,是一个封装好的Linux操作系统,内置大量的网络安全检测工具以及黑客破解软件等. Back Track因可以方便的破解无线网络而出名,其中内置的spoonwep2是一个非 ...

  5. 微信公众账号【iOSDevTip】推出新栏目【看大牛】

    首先你须要关注微信公众账号[iOSDevTip] 基于微信公众平台数据分析.非常easy发现.移动端project师都喜欢关注互联网创业资讯.都说.一个不关注互联网创业的iOS开发不是一个合格的互联网 ...

  6. cocos2d-x精灵移动的方法

    1.飞机发射子弹型 想要实现子弹的的飞行效果,又不想在每帧Update里计算位置,最好的方法调用CCMoveTo 例在发射子弹的时机,能够ccTouchBegan时: CCMoveTo* move = ...

  7. C#中hashtable的赋值、取值、遍历、排序操作

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...

  8. RDF Database和NoSql DB

    一篇比较老的文章,介绍了RDF Database和其他一些分类的NoSql DB http://blog.datagraph.org/2010/04/rdf-nosql-diff

  9. 大数据笔记02:大数据之Hadoop的生态系统和版本

    1.Hadoop的生态系统: (1)图1: (2)图2: 图1 和 图2 都是形象说明了Hadoop的生态圈. 2.举例介绍Hadoop生态圈的小工具: (1)Hive工具(中文意思:小蜜蜂) 利用H ...

  10. 监听视图树 OnGlobalLayoutListener

    背景 我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例: 首先我们写一个控件 public class MyImageView extends ImageView ...