用户界面线程AfxBeginThread的使用

原文链接地址:http://blog.csdn.net/akof1314/article/details/5762027

用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。

AfxBeginThread 函数原型如下:

CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
CWinThread* AfxBeginThread(
   CRuntimeClass* pThreadClass,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

用户界面线程必须包含有消息循环,以便可以处理用户消息。要使用用户界面线程,必须派生自CWinThread 类一个线程类,而且一般要重写类的InitInstance ()和ExitInstance ()函数。

示例:编写一个应用程序,当用户在程序主窗口按下鼠标左键时,会启动一个用户界面线程。当用户在线程窗口界面按下鼠标左键时,会弹出一个信息框。

1.新建单文档程序;

2.单击菜单栏“项目”→“添加类”→“MFC类”,基类选择“CWinThread ",类名输入CMyThread,点”完成“,同时以类似步骤以CFrameWnd类为基类派生CMyWnd 类;

3.在视图类实现文件包含头文件:

#include "MyThread.h"

4.在CMyThread类实现文件中包含头文件:

#include "MyWnd.h"

5.在CMyThread::InitInstance()中创建线程中的窗体:

BOOL CMyThread::InitInstance()
{
    CMyWnd *pFrameWnd = new  CMyWnd();
    pFrameWnd->Create(NULL, _T("Thread Windows" ));
    pFrameWnd->ShowWindow(SW_SHOW);
    pFrameWnd->UpdateWindow();
return  TRUE;
}

6.在CMyWnd类中修改构造函数CMyWnd() 为public 属性,然后实现鼠标左键消息响应函数:

void  CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
    LPTSTR pMessage = _T("This is a window thread" );
    CWnd *pMainWnd = AfxGetMainWnd();
    ::MessageBox(NULL, pMessage, _T("Thread Message" , MB_OK));
    CFrameWnd::OnLButtonDown(nFlags, point);
}

7.在应用程序视图类中实现鼠标左键响应函数:

void  CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
    AfxBeginThread(RUNTIME_CLASS(CMyThread));
    CView::OnLButtonDown(nFlags, point);
}

程序运行结果:

这里要注意的是,这个用户界面不是属于主框架窗口的,可以说是和主线程窗口并列的。通过查看桌面任务栏就可以发现,两个窗口并行着显示,而且互相不影响。注意上面给出的代码MessageBox 是引用API的,并且是无窗口,所以这里有三个并行的窗口,而且各不干扰。单独关闭用户界面线程的窗体,可以正常退出用户界面线程。但是如果直接关闭了主线程窗体,那么用户界面线程就会非法关闭,造成内存泄露。

对于用户界面线程的正常退出,只要在用户界面线程内调用PostQuitMessage 即可,参数为0的话,代表成功完成。

时间: 2024-10-10 17:55:51

用户界面线程AfxBeginThread的使用的相关文章

用户界面线程实现

用户界面线程实现的技巧 1.问题阐述 MFC中有两类线程,分别称为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等.用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等.但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务. 2.实现技巧 当一个Win

VC++ 结束线程 AfxBeginThread AfxEndThread

如果你的线程是从CWinThread继承出来的,结束自己就用AfxEndThread, 如果是外部调用的话,可以用PostThreadMessage(m_nThreadID, WM_QUIT,0,0);给这个线程发送消息,线程就会结束的, 其中的m_nThreadID是线程ID. 线程的ID可以这样得到 private: DWORD h_MemoryDraw;//定义变量 h_MemoryDraw = AfxBeginThread(MemoryDraw, Param)->m_nThreadID;

工作线程AfxBeginThread的使用

原文链接地址:http://blog.csdn.net/akof1314/article/details/5761689 工作线程通常用来执行一些后台任务,如:数据计算.后台杀毒等等.因为不需要创建窗口和处理用户消息,编写比较容易,在程序中只要调用AfxBeginThread 函数就可以创建并启动一个工作线程了. AfxBeginThread 的原型如下: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pPara

猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止

增加一按钮  双击: SPY++查看  进程下面的线程: 另一个线程函数: 定义一个指针变量: 在构造函数中初始化: 暂停线程: 线程继续: 定义布尔变量 记录 线程有没有在运行: 初始化该变量: 修改县城函数demoA: 对话框添加按钮,双击该按钮: 增加一个线程函数: 实现线程函数: 增加第2个按钮  掉用第二个线程函数:' 按了第一个按钮立马按第二个按钮时  也就是当两个线程并发执行时就会出错: 以上是线程同步的四种方法,是MFC的C++类 定义指针:指向临界区对象: 在构造函数中 创建临

MFC线程

1.分类 工作者线程 -主要用于后台的耗时的操作,通常没有用户界面 用户界面线程 -拥有独立的用户界面 2.使用 2.1工作者线程的使用 1--首先实现线程的回调函数,函数原型:UINT MyControlingFunction(LPVOID pParam); 2--创建和启动工作者线程  AfxBeginThread 2.2用户界面线程的使用 1--添加CWinThread类的派生类 2--在派生类的InitInstance()函数中创建用户界面 3--创建和启动用户界面线程  AfxBegi

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

【C++】线程_beginthreadex参数说明

unsigned long _beginthreadex( void * _Security, //第1个参数:安全属性,NULL为默认安全属性 unsigned _StackSize, //第2个参数:指定线程堆栈的大小.如果为0,则线程堆栈大小和创建它的线程的相同.一般用0 unsigned ( __stdcall * _StartAddress )( void * ), //第3个参数:指定线程函数的地址,也就是线程调用执行的函数地址(用函数名称即可,函数名称就表示地址) void * _

C++ AfxBeginThread的介绍/基本用法

AfxBeginThread    用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一个用于工作者线程,分别有如下的原型和过程: 用户界面线程的AfxBeginThread用户界面线程的AfxBeginThread的原型如下: CWinThread* AFXAPI AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority,

mfc小工具开发之定时闹钟之---多线程急线程同步

一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等.用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等.但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务. 在MFC中,一般用全局函数Afx