C++创建线程方式

14 篇文章 5 订阅
7 篇文章 0 订阅

C++ 创建线程方式如下:

  • 1,CreateThread;
  • 2,_beginthreadex;
  • 3,C++11 标准下的std::thread;
  • 4,MFC 下的AfxBeginThread;
  • 5,Qt 下的QThread
    创建线程方式1:CreateThread
static HANDLE CreateThread(
   LPSECURITY_ATTRIBUTES lpsa,
   DWORD dwStackSize,
   LPTHREAD_START_ROUTINE pfnThreadProc,
   void* pvParam,
   DWORD dwCreationFlags,
   DWORD* pdwThreadId 
) throw( );

CreateThread 线程相关函数:

CreateThread() 创建一个线程

ExitThread() 正常结束一个线程的执行

TerminateThead() 强制终止一个线程的执行

ResumeThread() 重启一个线程

SuspendThread() 挂起一个线程

GetExiCodeThread() 得到一个线程的退出码

GetThreadPriority() 得到一个线程的优先级

SetThreadPriority() 设置一个线程的优先级

CloseHandle() 关闭一个线程的句柄

CreateRemoteThread() 再另一个进程中创建一个新线程

PostThreadMessage() 发送一条消息给指定的线程

GetCurrentThread() 得到当前的线程句柄

GetCurrentThreadId() 得到当前线程的ID

GetThreadId() 得到指定线程的ID

WaitForSingleObject() 等待单个对象

WaitForMultipleObjects() 等待多个对象
static DWORD WINAPI myThreadFun(LPVOID lp);
/***************1 CreateThread *******************/
	HANDLE m_myCreateThread = CreateThread(NULL,//线程安全属性
		0,//堆栈大小
		CCWTestThreadDlg::myThreadFun,//线程函数
		0,//线程参数
		0,//线程创建属性
		NULL);//线程ID

	if (m_myCreateThread == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox(L"INVALID_HANDLE_VALUE ");
		return;
	}
	//设置线程优先级
	SetThreadPriority(m_myCreateThread, THREAD_PRIORITY_ABOVE_NORMAL);
	ResumeThread(m_myCreateThread);
	//关闭线程
	CloseHandle(m_myCreateThread);

DWORD WINAPI CCWTestThreadDlg::myThreadFun(LPVOID lp)
{
	while (true)
	{
	}

	return 0;
}

创建线程方式2:_beginthreadex

static unsigned __stdcall myBeginThreadFun(void* pArguments);
/***************2 _beginthreadex *******************/
	HANDLE  m_myBeginThread = (HANDLE)_beginthreadex(NULL, 0, CCWTestThreadDlg::myBeginThreadFun, NULL, 0, NULL);
	if (m_myBeginThread == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox(L"m_myBeginThread INVALID_HANDLE_VALUE");
		return;
	}
	//设置线程优先级
	SetThreadPriority(m_myBeginThread, THREAD_PRIORITY_ABOVE_NORMAL);
	ResumeThread(m_myBeginThread);
	//关闭线程
	CloseHandle(m_myBeginThread);

unsigned __stdcall CCWTestThreadDlg::myBeginThreadFun(void* pArguments)
{
	while (true)
	{		
	}
	return 0;
}

创建线程方式3:C++11 标准下的std::thread

/***************4 std::thread *******************/
void myC11ThreadFun();
	std::thread m_pthreadc11;
	m_pthreadc11 = std::thread(&CCWTestThreadDlg::myC11ThreadFun, this);
	//m_pthreadc11.join();

	//关闭线程
	if (m_pthreadc11.joinable())
	{
		m_pthreadc11.detach();
	}
void CCWTestThreadDlg::myC11ThreadFun()
{
	while (true)
	{
		if (/*m_bStop*/)
		{
			break;
		}
	}
}

创建线程方式4:MFC 下的AfxBeginThread

static UINT myAfxThreadFun(LPVOID pParam);
/***************3 AfxBeginThread *******************/
	/*AfxBeginThread 的第一个窗体创建辅助线程。 第二个窗体创建了一个可用作用户界面线程或辅助线程的线程。
	AfxBeginThread 可创建新的 CWinThread 对象,调用其 CreateThread 函数以开始执行线程,然后将指针返回到线程。 
	在整个过程中进行检查,确保假如创建过程的任何部分出现故障,所有对象都能被正确地解除分配。 
	若想关闭线程,请从线程内调用 AfxEndThread,或从辅助线程的控制函数返回。
	应用程序必须启用多线程;否则此函数将失败。 有关启用多线程的更多信息,请参考 Visual C++ 编译器选项下的 /MD、/MT、/LD(使用运行库)。
	*/
	m_pmyAfxThread = AfxBeginThread(CCWTestThreadDlg::myAfxThreadFun, this, THREAD_PRIORITY_ABOVE_NORMAL, 0, 0);
	if (m_pmyAfxThread == nullptr)
	{
		AfxMessageBox(L"m_pmyAfxThread INVALID_HANDLE_VALUE");
		return;
	}
UINT CCWTestThreadDlg::myAfxThreadFun(LPVOID pParam)
{
	while (true)
	{
		if (m_bStop)
		{
			//内部释放线程
			AfxEndThread(m_pmyAfxThread->m_nThreadID);
		}
	}
}

创建线程方式5:Qt 下的QThread

#ifndef MYQTHREAD_H
#define MYQTHREAD_H

#include <QThread>

class myQThread : public QThread
{
	Q_OBJECT

public:
	myQThread(QObject *parent);
	~myQThread();
public:
	void run();
private:
	
};

#endif // MYQTHREAD_H
#include "myqthread.h"

#include <QDebug>
myQThread::myQThread(QObject *parent)
	: QThread(parent)
{

}

myQThread::~myQThread()
{

}

void myQThread::run()
{
	while (1)
	{
		qDebug() << "test";
	}
}

	myQThread *m_pmythread;
	m_pmythread = new myQThread(this);
	m_pmythread->start();
	m_pmythread->setPriority(QThread::HighPriority);

分析:
方式1和2线程内部不停止也可释放,其他方式线程内部需要停止才可释放,相比其他方式的线程,方式1和2也相对安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值