MFC多线程“小结”

CPU调度单位是线程而不是进程,调度器据以排序的是每个线程的优先级。如果线程A和线程B具有相同优先级,调度器会挑选等待时间比较久的那个。

一、线程调度

调度器会弹性调整线程优先级,以强化系统的反应能力,并且避免任何一个线程一直未能接受CPU的润泽。例如:一般的线程优先级是7,如果它被切换到前台,调度系统可能暂时地把它调升到8或9或更高。对于那些有着输入消息等待被处理的线程,调度系统也会暂时调高其优先级。

二、线程产生

以::CreateThread产生一个线程,并指定一个线程函数,它就是一个worker thread,除非在它的生命中接触到了输入消息,这时候它应该有一个消息循环,以抓取消息,于是该线程就变为UI thread。

CWinThread对象代表一个线程本身。每当你需要一个线程时,不应该在MFC程序中直接调用::CreateThread或_beginthreadex,应该先产生一个CWinThread对象,再调用其成员函数CreateThread或全局函数AfxBeginThread。CWinThread::CreateThread或AfxBeginThread内部调用了beginthreadex。

CWinThread::CreateThread和AfxBeginThread不只是::CreateThread的一层封装,更做了一些application framework所需的内部数据初始化工作,并确保使用正确的C runtime library版本。

1、产生一个Worker Thread

CWinThread *pThread = AfxBeginThread(ThreadFunc, &param);
UINT ThreadFunc(LPVOID param)
{
}

2、产生一个UI Thread

UI Thread不能够由一个函数来代表,应该先从CWinThread派生出一个自己的类,再调用AfxBeginThread产生一个CWinThread对象。

注意:

(1)线程函数是由系统调用的,也就是一个callback函数,不容许有this指针参数。所以任何一般的C++类成员函数都不能拿来当线程函数,它必须是个全局函数或是个C++类的static成员函数。

(2)比较好的做法是把所有UI操作都集中在主线程,其他的“纯运算操作”才考虑交给Worker Thread去做。

三、线程结束

Worker Thread的生命就是线程函数本身,函数一旦return,线程结束。或者线程函数调用AfxEndThread结束一个线程。UI Thread因为有消息循环的关系,必须在消息队列中放一个WM_QUIT,才能结束线程。或在线程的任何一个函数中调用AfxEndThread也可以结束线程。

AfxEndThread内部调用_endthreadex,由它结束线程。

四、线程与同步控制

Windows系统提供了四种同步化机制,MFC也提供了四个对应的类。

(1)Critical Section(关键区域)。

(2)Semaphore(信号量)。

(3)Event(事件)。

(4)Mutex(互斥器)。

时间: 2024-10-12 19:07:50

MFC多线程“小结”的相关文章

黑马程序员___多线程小结

----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 进程和线程 进程是正在进行中的程序,指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程. Java程序的进程里有几个线程:主线程, 垃圾回收线程(后台线程) 线程是指进程中的一个执行任务(控制单元),一个进程中可以运行多个线程,多个线程可共享数据.多线程:在同一个进程中同时运行的多个任务;一个进程至少有一个线程,为了提高效率,可以在一个进程中

深入浅出MFC——MFC多线程程序设计(七)

1. 从操作系统层面看线程——三个观念:模块(MDB).进程(PDB).线程(TDB) 2. “执行事实”发生在线程身上,而不在进程身上.也就是说,CPU调度单位是线程而非进程.调度器据以排序的,是每个线程的优先级. 3. MDB.PDB和TDB: 注:Thread Context:线程环境,也即构成线程的“后台”. 4. 从程序设计层面看线程——Worker Threads 和 UI Threads: 5. MFC多线程程序设计——探索CWinThread. 6. Worker Thread:

MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档)

原文:http://download.csdn.net/download/jobfind/9559162 MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档).rar

MFC多线程内存泄漏问题&解决方法

在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现.而对于后台的数据处理.我们可能会用到多线程来处理. 那么对于大多数人(尤其是我这样的菜鸟),一个比較快捷的方法便是选择MFC多线程:AfxBeginThread或者CreateThread来进建立多线程.当一两个线程还是能够得.当有3个或者3个以上的线程出现时,极可能出现内存泄漏.原因分析例如以下: CWinThread的多线程不安全性: 由于 CWinThread 会调用_beginthre

MFC多线程内存泄漏问题&解决方法

在用visual studio进行界面编程时(如MFC),前台UI我们可以通过MFC的消息循环机制实现.而对于后台的数据处理,我们可能会用到多线程来处理.那么对于大多数人(尤其是我这种菜鸟),一个比较快捷的方法便是选择MFC多线程:AfxBeginThread或者CreateThread来进建立多线程.当一两个线程还是可以得,当有3个或者3个以上的线程出现时,极可能出现内存泄漏.原因分析如下: CWinThread的多线程不安全性: 因为 CWinThread 会调用_beginthreadex

MFC多线程

MFC多线程 分类: C/C++2013-05-31 23:33 256人阅读 评论(0) 收藏 举报 MFC多线程 (一) MFC对多线程编程的支持             MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环.         工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等.用户界面线程一般用于处理独立于其他线程执行之外 的用户输入,响应用户及系

MFC 多线程

//创建工作线程 CWinThread* AFXAPIAfxBeginThread( AFX_THREADPROC pfnThreadProc,//线程函数 LPVOID pParam,//传给线程函数的参数 int nPriority =THREAD_PRIORITY_NORMAL,//线程的优先级 UINT nStackSize = 0,//堆栈大小 DWORD dwCreateFlags = 0,//创建起始状态标志 LPSECURITY_ATTRIBUTES lpSecurityAttr

MFC多线程各种线程用法 .

http://blog.csdn.net/qq61394323/article/details/9328301 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下: void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); //

MFC多线程创建教程示例

最近对VC中的多线程比较感兴趣,查了资料,感觉这个写的比较实用.对博客里的内容进行部分改正,以实用VS2013. http://blog.csdn.net/chen825919148/article/details/7904169 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为"延时6秒",添加按钮的响应函数,代