vc 创建线程

152 篇文章 1 订阅

    // 定时清空显示
    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函数.
// 我们也可以自己写线程函数, 不使用宏.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值