您的位置:首页 > 其它

vc 创建线程

2010-03-26 11:14 295 查看
// 定时清空显示
static DWORD WINAPI ThreadProcClear(LPVOID lpParameter);
void CreateTreadClear();
void ReleaseThreadClear();
void ThreadClearRun();
HANDLE m_hThreadClear;
HANDLE m_hEventThreadClear;
bool m_bThreadClearExit;

// 初始化
HANDLE m_hThreadClear;
HANDLE m_hEventThreadClear;
bool m_bThreadClearExit;

// 定时清空显示
DWORD WINAPI CRnsClientDlg::ThreadProcClear(LPVOID lpParameter)
{
CClientDlg* pDlg = (CClientDlg*)lpParameter;
pDlg->ThreadClearRun();
return 0;
}
void CClientDlg::CreateTreadClear()
{
m_bThreadClearExit = false;
m_hEventThreadClear = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD dwThreadID;
m_hThreadClear = ::CreateThread(
NULL, 0, CClientDlg::ThreadProcClear,
this, 0, &dwThreadID);
}
void CClientDlg::ReleaseThreadClear()
{
m_bThreadClearExit = true;
SetEvent(m_hEventThreadClear);
WaitForSingleObject(m_hThreadClear, 1000);
CloseHandle(m_hEventThreadClear);
m_hEventThreadClear = 0;
}
void CClientDlg::ThreadClearRun()
{
while(1)
{
WaitForSingleObject(m_hEventThreadClear, INFINITE);
if(m_bThreadClearExit)
{
return;
}
Sleep(5000);
if(m_nStatu == 0)
{
OnBnClickedClear();
}
if(m_bThreadClearExit)
{
ret

对上面的代码封装成类来使用
// 头文件 HYThread.h

#pragma once
#include <Windows.h>

#define DECLARE_THREADFUN(className, ThreadFunName) \
DWORD ThreadFunName(); \
static DWORD WINAPI ThreadFunName##Thread(LPVOID lpParameter) \
{ \
return ((className*)lpParameter)->ThreadFunName(); \
} \

class CHYThread
{
public:
CHYThread();
~CHYThread();

// 参数: LPTHREAD_START_ROUTINE lpStartAddress 线程函数
// LPVOID lpParameter 线程函数参数
void CreateThread(LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter);
void ReleaseThread();

volatile bool m_bThreadExit;
HANDLE m_hThread;
HANDLE m_hEvent;
DWORD m_dwThreadID;
};


// 实现文件
#include "stdafx.h"
#include "HYThread.h"

CHYThread::CHYThread()
: m_bThreadExit(true)
, m_hThread(0)
, m_hEvent(0)
, m_dwThreadID(0)
{}

CHYThread::~CHYThread()
{
ReleaseThread();
}

void CHYThread::CreateThread(LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter)
{
m_bThreadExit = false;
m_hEvent = ::CreateEvent(0, false, false, 0);
m_hThread = ::CreateThread(NULL, 0, lpStartAddress, lpParameter, 0, &m_dwThreadID);
}

void CHYThread::ReleaseThread()
{
m_bThreadExit = true;
::SetEvent(m_hEvent);
::WaitForSingleObject(m_hThread, INFINITE);
::CloseHandle(m_hEvent);
::CloseHandle(m_hThread);
m_hEvent = 0;
m_hThread = 0;
}


// 调用
#include "HYThread.h"

class Test
{
public:
Test();

DECLARE_THREADFUN(Test, TestJust);
};

Test::Test()
{

}

DWORD Test::TestJust()
{
printf("Test\n");
return 0;
}

Test test;
// 声明线程对象
CHYThread hyThread;
// 创建线程, 传递线程函数地址和线程函数参数
hyThread.CreateThread(Test::TestJustThread, &test);

// 在Test类中, 使用了DECLARE_THREADFUN来声明一个Test类的静态函数, 静态函数中调用Test类的TestJust函数.
// 我们也可以自己写线程函数, 不使用宏.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  winapi null