您的位置:首页 > Web前端

CWinThread的使用方法

2012-06-14 17:00 323 查看
http://blog.csdn.net/xs813/article/details/6342907

CWinThread的使用方法

技术资料 2011-01-12
16:44:52 阅读215 评论0   字号:大小 订阅

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, 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 );

返回值:

指向新创建的线程对象。

参数:

pfnThreadProc:工作线程的函数指针,不可以为空。并且工作线程的函数必须如此声明:

               UINT MyControllingFunction( LPVOID pParam );

pThreadClass: 从CWinThread类继承来的对象的RUNTIME_CLASS指针。

pParam:    传递给工作线程函数pfnThreadProc的参数。

nPriority:  线程的优先级。如果为0,则与创建它的线程优先级相同。可以通过参考Win32 Programmer’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 objects are deallocated properly 

should any part of the creation fail. 终止线程,可以在线程函数中调用AfxEndThread, 或者从工作线程

的函数中返回。

 

示例:

   创建一个工作线程:

UINT       WorkForce(LPVOID lpParameter);//线程函数声明

CWinThread       *pMyFirstWorker,*pMySecondWorker;

LPVOID       pParam = NULL;

int       nPriority = THREAD_PRIORITY_ABOVE_NORMAL;//默认为THREAD_PRIORITY_NORMAL

UINT       nStackSize = 0;//与创建它的线程堆栈大小相同

DWORD       dwCreateFlags = 0;//创建后立即执行

LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ;//与创建它的线程安全属性相同

pMyFirstWorker=AfxBeginThread(WorkForce, pParam, nPriority , nStackSize,

dwCreateFlags , lpSecurityAttrs);

pMySecondWorker=AfxBeginThread( WorkForce, (LPVOID)&port);//如果采用默认值

UINT WorkForce( LPVOID lpParameter   // 线程所需参数,可以通过它传递数据)

{

 int nPort=*((int*)pParam); //这里获得的nPort就是输入时候传递进来的.

return 0;//什么不做



 

第二 销毁线程

 

首先需要说明的是销毁线程函数AfxEndThread,只能运用于线程内销毁.不同线程之间应建立通信渠道.下面是段具体代码:

UINT WorkForce( LPVOID lpParameter   // 线程所需参数,可以通过它传递数据)



 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 + 1

class 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);
}

这是框架,需要什么操作,自己定义、添加自己的线程消息就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息