MFC多线程CWinThread的使用方法转 cwinthread run

CWinThread的使用方法

CWinThread类成员

数据成员 m_bAutoDelete 指定线程结束时是否要销毁对象
m_hThread 当前线程的句柄
m_nThreadID 当前线程的ID
m_pMainWnd 保存指向应用程序的主窗口的指针
m_pActiveWnd 指向容器应用程序的主窗口,当一个OLE服务器被现场激活时

构造函数 CWinThread 构造一个CWinThread对象
CreateThread 开始一个CWinThread对象的执行

操作 GetMainWnd 查询指向线程主窗口的指针
GetThreadPriority 获取当前线程的优先级
PostThreadMessage 向另外的CWinThread对象传递一条消息
ResumeThread 减少一个线程的挂起计数
SetThreadPriority 设置当前线程的优先级
SuspendThread 增加一个线程的挂起计数

可重载函数 ExitInstance 重载以进行线程终止时的清理工作
InitInstance 重载以实现线程实例的初始化
OnIdle 重载以进行线程特定的空闲操作
PreTranslateMessage在消息被发送到Windows函数TranslateMessage和DispatchMessage之前过滤消息
IsIdleMessage 检测特定的消息
ProcessWndProcException 截获线程消息和命令处理函数出现的所有未处理的异常
ProcessMessageFilter 在特定的消息到达应用程序之前截获消息
Run线程的具有消息收发功能的控制函数,可重载以定制缺省的消息循环


第一 创建线程
函数原型:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOIDpParam, int nPriority =
THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags =0, LPSECURITY_ATTRIBUTES
lpSecurityAttrs = NULL );
CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, intnPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs = NULL );
返回值:
指向新创建的线程对象。
参数:
pfnThreadProc:工作线程的函数指针,不可以为空。并且工作线程的函数必须如此声明:
UINT MyControllingFunction( LPVOID pParam );
pThreadClass: 从CWinThread类继承来的对象的RUNTIME_CLASS指针。
pParam:    传递给工作线程函数pfnThreadProc的参数。
nPriority:  线程的优先级。如果为0,则与创建它的线程优先级相同。可以通过参考Win32Programmer’s
Reference中的SetThreadPriority得到所有可用的优先级列表和描述。
nStackSize:  以字节为单位指定新线程的堆栈大小。如果为0,则与创建它的线程的堆栈大小相同。
dwCreateFlags:指定一个额外的标志控制线程的产生。它可以包括下面两个值中的一个:
       CREATE_SUSPENDED:以挂起模式开始线程,并且指定挂起次数.当调用ResumeThread时,这个
线程才会被执行。
0     :创建之后,马上执行线程。
lpSecurityAttrs:指向SECURITY_ATTRIBUTES结构的指针,结构中指定了线程的安全属性。如果为NULL,则与
创建它的线程的安全属性相同。如果希望得到更多的有关SECURITY_ATTRIBUTES结构的信息,
请参考Win32 Programmer’s Reference。
注释:
调用这个函数创建一个新的线程。第一种形式的AfxBeginThread创建一个工作线程;第二种形式创建一个用户
接口线程。
AfxBeginThread创建一个新CWinThread对象,调用它的CreateThread函数开始执行线程并且返回指向线程的指
针。Checks are made throughout the procedure to make sure all objectsare deallocated properly
should any part of the creation fail. 终止线程,可以在线程函数中调用AfxEndThread,或者从工作线程
的函数中返回。

示例:
创建一个工作线程:
UINTWorkForce(LPVOID lpParameter);//线程函数声明
CWinThread*pMyFirstWorker,*pMySecondWorker;
LPVOIDpParam = NULL;
intnPriority =THREAD_PRIORITY_ABOVE_NORMAL;//默认为THREAD_PRIORITY_NORMAL
UINTnStackSize = 0;//与创建它的线程堆栈大小相同
DWORDdwCreateFlags = 0;//创建后立即执行
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ;//与创建它的线程安全属性相同
pMyFirstWorker=AfxBeginThread(WorkForce, pParam, nPriority ,nStackSize,
dwCreateFlags , lpSecurityAttrs);
pMySecondWorker=AfxBeginThread( WorkForce,(LPVOID)&port);//如果采用默认值
UINTWorkForce( LPVOIDlpParameter //线程所需参数,可以通过它传递数据)
{
int nPort=*((int*)pParam);//这里获得的nPort就是输入时候传递进来的.
return 0;//什么不做
}

第二 销毁线程

首先需要说明的是销毁线程函数AfxEndThread,只能运用于线程内销毁.不同线程之间应建立通信渠道.下面是段具体代码:
UINTWorkForce( LPVOIDlpParameter //线程所需参数,可以通过它传递数据)
{
int nPort=*((int*)pParam);//这里获得的nPort就是输入时候传递进来的.
if( bExitCode )//满足销毁的条件
{
DWORD ExitCode=0;
GetExitCodeThread(p->m_hThread,&ExitCode);
//p为需要销毁的CWindThreadZ指针,其在创建线程时可以拿到.
if(ExitCode>0 )
AfxEndThread(ExitCode,true);

}
return 0;//什么不做
}

也可以用线程派生类的方式。

C/C++ code

.h 文件#define WM_TEST WM_USER + 1class CTestThread : public CWinThread{ DECLARE_DYNCREATE(CTestThread)protected: CTestThread (); virtual ~CTestThread ();public: virtual BOOL InitInstance(); virtual int ExitInstance();protected: afx_msg void OnTest(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP()};.Cpp 文件#include "stdafx.h"#include "TestThread.h"IMPLEMENT_DYNCREATE(CTestThread, CWinThread)CTestThread::CTestThread(){}CTestThread::~CTestThread(){}BEGIN_MESSAGE_MAP(CTestThread, CWinThread) ON_THREAD_MESSAGE(WM_TEST,OnTest)END_MESSAGE_MAP()BOOL CTestThread::InitInstance(){ return TRUE;}int CTestThread::ExitInstance(){ return CWinThread::ExitInstance();}void CTestThread::OnTest(WPARAM wParam,LPARAM lParam){ AfxMessageBox("test");}调用的地方 CWinThread* m_pThrd; //启动 m_pThrd = AfxBeginThread(RUNTIME_CLASS(CTestThread)); // 需要执行线程中的操作时 m_pThrd->PostThreadMessage(WM_TEST,NULL,NULL); // 结束线程 HANDLE hp=m_pThrd->m_hThread; if (hp) { if (WaitForSingleObject(hp, 1) != WAIT_OBJECT_0) { TerminateThread(hp,0); } CloseHandle(hp); }
这是框架,需要什么操作,自己定义、添加自己的线程消息就可以了。
//==========测试过的例子====================
1、CUIThread.h
#pragma once
#define WM_TEST WM_USER + 105
class CUIThread : public CWinThread
{
MFC多线程CWinThread的使用方法[转] cwinthread run
DECLARE_DYNCREATE(CUIThread)
public: //protected:
CUIThread(); // 动态创建所使用的受保护的构造函数
virtual ~CUIThread();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
protected:
afx_msg void OnTest(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
};
2、CUIThread.cpp
// UIThread.cpp : 实现文件

#include "stdafx.h"
#include "UIThread.h"
IMPLEMENT_DYNCREATE(CUIThread, CWinThread)
CUIThread::CUIThread()
{
}
CUIThread::~CUIThread()
{
}
BOOL CUIThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
return TRUE;
}
int CUIThread::ExitInstance()
{
// TODO: 在此执行任意逐线程清理
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CUIThread, CWinThread)
ON_THREAD_MESSAGE(WM_TEST,OnTest)
END_MESSAGE_MAP()

// CUIThread 消息处理程序
void CUIThread::OnTest(WPARAM wParam,LPARAM lParam)
{
AfxMessageBox("test");
}
3、调用的地方
Dlg.h中定义:CWinThread* m_pThrd;
Dlg.cpp的OnInitDialog()中初始化启动:
         m_pThrd = AfxBeginThread(RUNTIME_CLASS(CUIThread));
Dlg.cpp中用到的地方调用: m_pThrd->PostThreadMessage(WM_TEST,NULL,NULL);
相关汇总:
http://www.vckbase.com/document/viewdoc/?id=1706

  

爱华网本文地址 » http://www.413yy.cn/a/25101010/23637.html

更多阅读

MFC中进度条控件的使用方法 mfc进度条控件使用

MFC中进度条控件的使用方法——简介进度条控件是程序开发中基础控件之一,常用于显示程序的进度。在进行程序安装、文件传输时经常用到。其用法也比较简单固定。今天就和大家分享一下其简单的使用方法吧。^_^MFC中进度条控件的使用方

多线程的使用(Delphi) delphi多线程实例

TThread在Classes单元中声明,直接从TObject继承下来的,因为,它不是组件.TThread是个抽象类,所以不能创建TThread的实例,而只能创建其派生类的实例.利用TThread类来编写多线程应用程序的一般步骤如下:[步骤一]从TThread类派生出一个

linux 下多线程编程 linux下的多线程编程

共13章:第一章 线程基础multithreading可以被翻译成多线程控制。与传统的UNIX不同,一个传统的UNIX进程包含一个单线程,而多线程(MT)则把一个进程分成很多可执行线程,每一个线程都独立运行。阅读本章可以让你理解:Defining Multithreading T

Linux下Qt多线程编程 linux下的多线程编程

作者:武汉华嵌技术部以下和大家分享Linux平台下Qt两种多线程编程的方式:1、使用Linux平台下的线程函数。以下是给出的代码片段://此处为连接信号和槽,通过Qt界面中两按钮来控制两个槽函数connect(pthred1start, SIGNAL(clicked()), this

声明:《MFC多线程CWinThread的使用方法转 cwinthread run》为网友给我申吟吗分享!如侵犯到您的合法权益请联系我们删除