MFC线程和同步
来源:互联网 发布:大数据 视频 编辑:程序博客网 时间:2024/05/19 20:59
1 MFC线程分类
1.1 工作者线程 - 在后台执行,不需要用户界面1.2 用户线程 - 提供了用户界面,可以与用户交互
2 MFC线程相关
2.1 线程创建和结束AfxBeginThread - 创建线程
AfxEndThread - 结束线程
2.2 CWinThread类 - 线程类,父类是CCmdTarget
2.3 同步类
CCriticalSection - 临界区
CEvent - 事件
CMutex - 互斥量
CSemaphone - 信号量
父类都是CSyncObject类,都是通过Lock/Unlock函数等候/释放同步操作
3 工作者线程的使用
3.1 线程函数的定义
线程函数原型UINT ThreadProc (LPVOID pVoid)
3.2 线程的创建
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
pfnThreadProc - 线程处理函数
pParam - 线程参数
nPriority - 线程优先级别,使用默认值
nStackSize - 线程堆栈,0使用缺省
dwCreateFlags - 创建标识,0创建后立即执行
lpSecurityAttrs - 安全属性
返回值CWinThread指针,封装了线程处理的一些函数
4 用户线程的使用
4.1 定义线程类
基于CWinThread派生子类4.2 在线程类中添加窗口
在子类Initinstance中创建并显示窗口,并将窗口指定为线程主窗口4.3 创建线程
AfxBeginThread()创建线程CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
pThreadClass - CWinThread派生子类的运行时类信息
4.4 与工作者线程的对比
4.4.1 在现象上可以添加用户界面4.4.2 在线程内部,增加自己的消息循环机制
工作者线程示例代码
// WorkThread.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "WorkThread.h"#ifdef _DEBUG#define new DEBUG_NEW#endifusing namespace std;//线程函数UINT AFX_CDECL ThreadProc(LPVOID){while (1){printf("WorkThread------\n");Sleep(1000);}return 0;}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;//创建线程CWinThread* pThread;pThread = AfxBeginThread(ThreadProc,NULL);system("pause");//结束线程TerminateThread(pThread->m_hThread, 0);return nRetCode;}
用户线程示例代码
定义自己的线程类,继承CWinThread
#pragma once#include "TestDlg.h"// CMyThreadclass CMyThread : public CWinThread{DECLARE_DYNCREATE(CMyThread)protected:CMyThread(); // 动态创建所使用的受保护的构造函数virtual ~CMyThread();public:virtual BOOL InitInstance();virtual int ExitInstance();protected:DECLARE_MESSAGE_MAP()};
在线程类中添加窗口
在子类Initinstance中创建并显示窗口,并将窗口指定为线程主窗口BOOL CMyThread::InitInstance(){// TODO: 在此执行任意逐线程初始化CTestDlg dlg;m_pMainWnd = &dlg;dlg.DoModal();return TRUE;}
创建线程
//创建用户线程CMyThread* myThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));
0 0
- MFC线程和同步
- MFC线程同步
- MFC中线程同步
- MFC 线程同步问题
- MFC中的线程同步
- MFC中线程同步
- MFC中线程同步
- MFC-线程同步
- MFC 线程同步
- MFC线程同步
- MFC 多线程及线程同步
- MFC 多线程及线程同步
- MFC 多线程及线程同步
- MFC多线程及线程同步
- MFC 多线程及线程同步
- MFC 多线程及线程同步
- MFC 多线程及线程同步
- MFC 多线程及线程同步
- Poj3304 Segments
- android 软键盘,右下角 内容设置
- Mysql 分表
- zoj 3627 贪心模拟
- HackRF 关于libusb not found(-5) 存在问题
- MFC线程和同步
- 关于嵌入式如何学习(看了不后悔,给学技术的同行一条光明的路)
- JavaScript客户端接口之SuperMap.Handler
- 相机标定之OpenCV&Matlab
- GTK+ TREEVIEW控件
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
- vs 中大括号之间垂直虚线显示
- 为你详细解读HTTP请求头的具体含意
- Ubuntu编译Android源代码