多线程快速入门

原创 2003年12月22日 18:18:00

多线程快速入门

多线程并不是什么新名词,MSDN中有许多介绍多线程的文章,然而MSDN全是英文,不利于阅读。为了让更多的朋友掌握多线程技术,本人写了这篇在VC++中使用多线程技术的文章,如有不足之处,请不吝指教。

一、线程的创建

MFC支持两类线程,worker线程和UI线程,使用得较多的是worker线程。要创建一个worker线程,最简单的办法就是使用AfxBeginThread()函数。这个函数的原型如下:

CWinThread* AfxBeginThread(

AFX_THREADPROC pfnThreadProc,

LPVOID pParam,

int nPriority=THREAD_PRIORITY_NORMAL,

UINT nStackSize=0,

DWORD dwCreateFlags=0,

LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL

);

参数说明:

pfnThreadProc

线程的控制函数,你可以在此函数中实现线程的功能。

pParam

用来传递参数给线程,如果不需要给线程传递任何参数,可以把它设为NULL

nPriority

新线程的优先权,默认值表示新线程的优先权与目前优先权相同。

nStackSize

新线程的堆栈大小(以字节为单位),0表示使用默认的堆栈大小。

dwCreateFlags

此值必须为0CREATE_SUSPENDED,使用0表示立刻开始执行线程的控制函数。

lpSecurityAttrs

给新线程指定安全属性,通常可以为NULL

返回值:

如果失败,返回NULL,否则指向新产生的CWinThread对象。

用此方法产生的CWinThread对象,在线程结束时会自动被删除。CWinThread中有一个成员变量m_bAutoDelete,它可以控制CWinThread对象是否被自动删除,要设置此变量,你必须以挂起方式产生线程。下面给出一个简单的例子:

#include <afxwin.h>

UINT MyThreadProc(LPVOID);//worker线程的控制函数

int main()

{

      CWinThread* pThread=NULL;

      pThread=AfxBeginThread(MyThreadProc,NULL,

THREAD_PRIORITY_NORMAL,

0,CREATE_SUSPENDED);

      ASSERT(pThread);

      pThread->m_bAutoDelete=FALSE;

      pThread->ResumeThread();

      WaitForSingleObject(pThread->m_hThread,INFINITE);

      //等待线程结束,此函数后面会介绍。

      delete pThread;

      return 0;

}

 

UINT MyThreadProc(LPVOID pData)

{

      //在此函数中执行耗时的工作

      ……

}

二、线程间的通讯

在多线程程序中,不可避免地要与其他线程通讯,要实现线程间的通讯,最简单的办法就是使用PostThreadMessage()函数,原型如下:

返回值:

如果消息成功发送,返回值为非0,否则为0

下面的例子给主线程发送一个MY_WM_QUIT自定义消息:

……

DWORD dwThreadID;

CMyApp* pApp=(CMyApp*)AfxGetApp();

dwThreadID=pApp->m_nThreadID;//主线程的ID

PostThreadMessage(

      dwThreadID,

MY_WM_QUIT,

(WPARAM)0,

(LPARAM)0);

……

三、等待线程结束

等待线程结束最简单的办法就是使用WaitForSingleObject()函数,此函数的原型如下:

DWORD WaitForSingleObject(

      HANDLE hHandle,//等待对象的handle

DWORD dwMilliseconds //等待的时间

);

返回值:

如果函数失败,返回WAIT_FAILED;如果等待的目标变成激发状态,返回WAIT_OBJECT_0;如果等待目标变成激发状态之前,等待时间结束了,将返回WAIT_TIMEOUT;如果线程有一个mutex(有关mutex的更多信息,请参见MSDN),并且在线程结束前没有释放,则返回WAIT_ABANDONED

dwMilliseconds参数可以设为0,此时函数立刻返回,如果等待目标的handle已经激发,则返回WAIT_OBJECT_0,否则返回WAIT_TIMEOUT,这样做可以节约许多等待的时间。

四、结束语

多线程技术并不难掌握,但要编写能正确运行的多线程程序,则要下一番功夫。本人用多线程技术编写了一个分割合并文件的软件,此软件用worker线程在后台分割、合并文件,主线程同时显示一个取消对话框,可以单击取消对话框中的取消按钮随时取消文件的分割、合并。详细情况请访问我的网站http://www.0735.com.cn/whstudio

 

架构设计:系统间通信(38)——Apache Camel快速入门(下1)

那么这里我们为什么又要花两篇文章的篇幅来介绍Apache Camel呢?因为后续文章中,在我们进行一款简单的ESB中间件设计时,我们将会依靠Apache Camel提供的协议转换、消息路由等核心能力。...
  • yinwenjie
  • yinwenjie
  • 2016年07月04日 08:33
  • 9875

BeagleBone Black快速入门教程

BeagleBone Black快速入门教程
  • u014621518
  • u014621518
  • 2014年12月03日 13:52
  • 1836

架构设计:系统间通信(37)——Apache Camel快速入门(中)

那么这里我们为什么又要花两篇文章的篇幅来介绍Apache Camel呢?因为后续文章中,在我们进行一款简单的ESB中间件设计时,我们将会依靠Apache Camel提供的协议转换、消息路由等核心能力。...
  • yinwenjie
  • yinwenjie
  • 2016年06月27日 15:45
  • 11444

多线程快速入门

线程与进程区别 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻...
  • KongZhongNiao
  • KongZhongNiao
  • 2018年01月08日 20:10
  • 8

java多线程与高并发的快速入门指南

并行世界的入门指南 并行计算主要适用于:图像处理+服务端编程(主要是java)。 性能翻倍的摩尔定律失效,软件开发为硬件设计者的无计可施所采取的多核cpu策略埋单。 同步/异步:同步需要等待调用...
  • gaoweijiegwj
  • gaoweijiegwj
  • 2016年11月08日 14:56
  • 450

Java多线程 快速入门(一)

Java 多线程 快速入门  首先多说一句,其实多线程是和相应的编程范式以及软件设计相契合的,如果只是单纯的谈多线程,其实学习效果不会太好 ... 1: 什么是线程? 线...
  • jccug2300702
  • jccug2300702
  • 2014年05月05日 23:59
  • 204

socket 网络编程快速入门(二)教你编写基于UDP/TCP的服务端多线程通信

在上一篇博文中,我们介绍了利用socket进行简单的UDP/TCP的服务端和客户端的通信。 (一) 在基于UDP的程序中,你有没有想过,如果我的这台主机在通讯的时候要求既能够收到别的主机发来的数据...
  • NK_test
  • NK_test
  • 2015年08月18日 18:41
  • 3505

Java多线程快速入门使用

一、线程与进程1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行2 进程:执行中的程序一个进程至少包含一个线程3 单线程:程序中只存在一个线程,实际上主方法就是一个主线程4 多线程:在一个...
  • newlifely
  • newlifely
  • 2018年01月10日 16:42
  • 16

JAVA多线程入门教程

  • 2010年09月02日 10:11
  • 186KB
  • 下载

关于c++ 多线程入门的文档

  • 2011年03月21日 20:37
  • 24KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程快速入门
举报原因:
原因补充:

(最多只允许输入30个字)