线程是一种从软件到硬件的技术,主要目的是为了提高运行速度,和多任务。

××××××××××××××××××××××××××××××××××××需要储备的资料(他人的)××××××××××××××××××××××××××××

××http://haobinnan.blog.51cto.com/775253/658446

多线程概述

进程和线程都是操作系统的概念。进程是在基于内存的概念,线程是基于CPU的概念。CPU不清楚什么玩意叫进程,CPU处理的任务叫线程。一个进程可以划分成多个线程给CPU处理。一个程序可以有多个进程 用于处理不同的事情。

进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。

线程是进程内部的一个执行单元,系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。

每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。

MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。

在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,(为啥叫重载形式呢?因为系统中已经有了这两个函数,在使用的使用给予不同的变量不就是重载的定义吗??是的)分别用于创建工作者线程和用户界面线程。两种重载函数原型和参数分别说明如下:

CreateThread是一个API,而AfxBeginThread是MFC中的一个函数。后者在内部调用了前者。

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

      对于工作线程来说,启动一个线程,首先需要编写一个希望与应用程序的其余部分并行运行的函数如Fun1(),

接着定义一个指向CwinThread对象的指针变量*pThread,(在MFC中可以用App)

调用AfxBeginThread(Fun1,param,priority)函数,返回值付给pThread变量的同时一并启动该线程来执行上面的Fun1()函数,

其中Fun1是线程要运行的函数的名字,也既是上面所说的控制函数的名字,param是准备传送给线程函数 Fun1的任意32位值,

priority则是定义该线程的优先级别,它是预定义的常数。

线程函数是回调函数,线程函数在类内必须是静态成员函数,或者是类外声明的全局函数。

因为静态成员函数不能访问类的非静态成员函数,所以在线程函数中要定义一个类的指针指向this指针,就可以用类的指针来调用类的成员函数。

数据传递使用this处理。

HMI  WORK线程   

CWinThread* AfxBeginThread(

AFX_THREADPROC pfnThreadProc,//指向工作者线程的执行函数的指针,线程函数原型必须声明如下: UINTExecutingFunction(LPVOID pParam);

LPVOID pParam,/**///传递给线程函数的一个32位参数,执行函数将用某种方式解释该值。它可以是数值,或是指向一个结构的指针,甚至可以被忽略;

nPriority=THREAD_PRIORITY_NORMAL,//线程的优先级。如果为0,则线程与其父线程具有相同的优先级;

UINTnStackSize=0,//线程为自己分配堆栈的大小,其单位为字节。如果nStackSize被设为0,则线程的堆栈被设置成与父线程堆栈相同大小;

DWORDdwCreateFlags=0,//如果为0,则线程在创建后立刻开始执行。如果为CREATE_SUSPEND,则线程在创建后立刻被挂起;

LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL//线程的安全属性指针,一般为NULL;

);

一个工作线程创建的实例: 环境是VS2010  MFC  Win7  64位系统。

<span style="background-color: rgb(0, 204, 204);">public://工作线程创建第一步:在某个头文件里面声明一个函数。static UINT Scada_Operational(LPVOID pParam);int aaa;
};extern CTestApp theApp;
</span>

×××

<span style="background-color: rgb(0, 204, 204);">//工作线程创建第二步:在对应的实现文件里面,定义这个函数。
UINT CTestApp::Scada_Operational(LPVOID pParam)
{Sleep(1000);AfxMessageBox(_T("准备赋值"));CTestApp* theApp = (CTestApp*)pParam;int bb=0;bb= theApp->aaa;Sleep(1000);AfxMessageBox(_T("完成赋值"));return 0;
}</span>

×××

<span style="background-color: rgb(0, 204, 204);">//工作线程创建第三步:使用MFC特有的函数AfxBeginThread 将函数变为线程。AfxBeginThread(Scada_Operational,this);</span>

源代码:http://pan.baidu.com/s/1mgrAxVM
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

UI线程

创建一个用户界面线程,首先要从类CwinThread产生一个派生类,同时必须使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现这个CwinThread派生类。
  第二步是根据需要重载该派生类的一些成员函数如:ExitInstance();InitInstance();OnIdle(); PreTranslateMessage()等函数,最后启动该用户界面线程,调用AfxBeginThread()函数的一个版   本:

CWinThread*AfxBeginThread(

CRuntimeClass* pThreadClass,//从CWinThread派生的RUNTIME_CLASS类;

intnPriority=THREAD_PRIORITY_NORMAL,//线程优先级,如果为0,则与创建该线程的线程相同;

UINT nStackSize=0,//线程的堆栈大小,如果为0,则与创建该线程的线程相同;

DWORD dwCreateFlags=0,//一个创建标识,如果是CREATE_SUSPENDED,

则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。

LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL//线程的安全属性,NT下有用。

);

范例 :

1、建立一个基于MFC的对话框应用程序。
2、向程序中添加一个以CWinThread为基类的新类CUIThread,该类用于启动一个用户界面线程。
3、向程序中添加一个对话框资源,并建立相应的对话框类CUIThreadDlg,这个对话框的基类是CDialogEx。

该对话框将被作为用户界面线程的主窗口。
4、在UIThread.h中加入#include "UIThreadDlg.h"和 

public:CUIThreadDlg m_dlg;

并在CUIThread::InitInstance()中加入

BOOL CUIThread::InitInstance()
{// TODO: 在此执行任意逐线程初始化//用户线程第六步:添加创建程序m_pMainWnd = &m_dlg;m_dlg.DoModal();;return TRUE;
}

5、CUIThread::InitInstance()中创建的CUIThreadDlg将与主窗口在独立的线程中运行,可以在CUIThreadDlg中加入各种执行耗时任务的代码而不会影响主窗口的运行。
6、在 原始对话框上面添加一个按钮 并创建点击事件响应函数,

//用户线程第七步:添加线程的头文件#include "UIThread.h"。

在函数中添加线程创建

void CTestGszDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码//CWinThread* p = AfxBeginThread(RUNTIME_CLASS(CUIThread));//用户线程第八步:正式创建线程AfxBeginThread(RUNTIME_CLASS(CUIThread));
}

7:我们创建的线程在结束的时候 销毁我们新建的对话框

int CUIThread::ExitInstance()
{
    m_dlg.DestroyWindow();
    return CWinThread::ExitInstance();
}

配套源代码:http://pan.baidu.com/s/1jGzLTye

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

几个常用的配套函数

//获取线程对象

CWinThread* AFXAPIAfxGetThread();

//获取当前消息

MSG* AFXAPIAfxGetCurrentMessage();

//结束线程执行

void AFXAPIAfxEndThread(UINTnExitCode,BOOLbDelete =TRUE);

//初始化线程

void AFXAPIAfxInitThread();

//终止线程执行

void AFXAPIAfxTermThread(HINSTANCEhInstTerm =NULL);

在MFC里面实现线程的实例相关推荐

  1. MFC 多线程及线程同步

    一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...

  2. MFC多线程各种线程用法 .

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_SLEEP_SI ...

  3. VC++ MFC 多线程及线程同步(详细、全面总结!)

    更多详情:http://blog.csdn.net/whyacinth/ VC++ MFC 多线程及线程同步 关键词: MFC    多线程及线程同步                          ...

  4. python 在主线程开线程_Python开启线程,在函数中开线程的实例

    逻辑处理上分成了多个模块,为了提高效率,前一个模块处理完调用后一个模块操作时使用多线程 我这里遇到的情形是前面取数据后面存到mysql,发现单线程效率很低,改为取数据后开线程存到mysql 开启线程之 ...

  5. async spring 默认线程池_Spring boot注解@Async线程池实例详解

    这篇文章主要介绍了Spring boot注解@Async线程池实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从Spring3开始提供了@A ...

  6. python可以开多少线程_Python开启线程,在函数中开线程的实例

    逻辑处理上分成了多个模块,为了提高效率,前一个模块处理完调用后一个模块操作时使用多线程 我这里遇到的情形是前面取数据后面存到mysql,发现单线程效率很低,改为取数据后开线程存到mysql 开启线程之 ...

  7. python守护线程_Python守护线程用法实例

    本文实例讲述了Python守护线程用法.分享给大家供大家参考,具体如下: 如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出.如果你的主线程在退出的时 ...

  8. python获取电脑几核几线程_python编程测试电脑开启最大线程数实例代码

    本文实例代码主要实现python编程测试电脑开启最大线程数,具体实现代码如下. #!/usr/bin/env python #coding=gbk import threading import ti ...

  9. MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

    MFC之AfxbeginThread 线程 创建.挂起.释放.结束.退出 本文简单阐述了如何使用一个afxbeginthread创建一个线程(两种方法,使用默认设置,使用自主设置参数),以及一些如同, ...

最新文章

  1. keil复制代码乱码_win7系统下Keil复制中文注释到记事本出现乱码的解决方法
  2. LeetCode Generate Parentheses
  3. Leetcode 217. 存在重复元素 解题思路及C++实现
  4. Android 打造自己的个性化应用(四):仿墨迹天气实现--自定义扩展名的zip格式的皮肤...
  5. 竞品分析框架及案例-探索业务方向
  6. 常用DOS系统功能调用(INT 21H)一览表
  7. 羊皮卷的实践-第二十五章
  8. java使用序列化实现深克隆
  9. iPhone 或将告别 3D Touch ?
  10. 内核如何检测soft lockup与hard lockup?
  11. React-Native入门指南——第七篇动手写组件
  12. 注塑模介绍、设计中文语音多媒体教学光盘 1CD
  13. Linux查看外网IP命令
  14. html5 人脸活体识别,基于HTML5的人脸识别活体认证的实现方法.pdf
  15. 静态HTML网页设计作品:旅游网站设计——开心旅游网(15页) HTML+CSS+JavaScript 主题度假酒店
  16. Android实践:基于聚合数据的手机号码归属地查询
  17. 过cloudflare,使用cfscrape,以及cfscrape挂代理的方式
  18. 数据结构(C语言版)之栈及递归
  19. 毕业设计 - 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正
  20. 很励志的故事(尸山代码)

热门文章

  1. mysql 聚簇索引实例_MySQL聚簇索引
  2. html个版本间的特点,了解下什么是HTML5,他与以往的版本有什么区别 什么新元素...
  3. python封装c++接口_使用MetaSIP自动生成SIP封装C++到Python接口
  4. linux下添加服务,Linux下添加服务
  5. go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod
  6. qgc地面站如何导入离线地图_地面站开发资源汇总
  7. 今天的编程语言是怎么来的?
  8. java百度地图添加标注_调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注...
  9. while(true) 循环中使用了sleep休眠了半小时就中断了_线程中断不是你想中断就能的...
  10. python开发需要学什么_用Python进行web开发需要学习什么?