C++创建线程方式

C++创建线程方式C 创建线程方式如下 1 CreateThread 2 beginthreade 3 C 11 标准下的 std thread 4 MFC 下的 AfxBeginThre 5 Qt 下的 QThread 创建线程方式 1 CreateThread LPSECURITY ATTRIBUTESlp DWORDdwStack LPTHREAD START ROUTINEpfnTh

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); 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231235.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国内软件外包公司排行榜是怎么样的

    国内软件外包公司排行榜是怎么样的由于互联网技术的快速发展,特别是手机移动端的的普及,使得企业越来越需要开发自己自己的软件,但是软件开发人才缺口很大,企业没有这个技术实力去开发自己的软件,对于中小企业也不好招人,而这软件外包开发公司就可以帮助企业实现目标,这其中鱼龙混杂,让不少想要软件外包开发的企业难以选择,那么国内软件外包公司排行榜是怎么样的呢?下面为大家介绍华盛恒辉排名靠前的原因。1、报价适中提供同样服务…

    2022年5月26日
    69
  • ASMX

    ASMX当Microsoft®.NETFramework第一次发布时,它引入了一个有突破性的Web服务框架,那就是ASMX。设计ASMX的目的在于尽可能地简化Web服务的开发过程,这样即使您不是XML专家,也可以创建并运行Web服务。ASMX是通过隐藏大多数基础XML和Web服务细节来实现这一点的。与强制开发人员直接处理SOAP信封和Web服务描述语言(W

    2022年4月28日
    109
  • densenet详解_dense参数

    densenet详解_dense参数DenseNet于论文《》中提出,是CVPR2017的oral。论文提出DenseNet并与ResNet和Inception做对较。为提升网络的效果,一般操作是增加网络的深度和宽度,但论文作者另辟蹊径,聚焦于feature的极致利用以获得更佳效果和更少参数。对于梯度消失问题,ResNet等网络使用跳层连接结构加以解决。作者延续该思路,提出DenseBlock,在保证网络层间最大程度的信息传输的同时,直接将所有层连接起来。……………………

    2022年9月29日
    5
  • java BigDecimal :注意,这是你可能会踩到的坑[通俗易懂]

    java BigDecimal :注意,这是你可能会踩到的坑[通俗易懂]在BigDecimal应用的过程中,有两个坑是我们比较容易遇到的,使用不当会出现莫名其妙的错误。1.构造函数的坑先看下面这段代码:publicvoidconstructTest(){BigDecimalvalue1=newBigDecimal(10.511);System.out.println(“value1:”+value1);BigDecimalva

    2022年5月31日
    31
  • 打造一个红旗(redflag)Linux的基础镜像(base image)「建议收藏」

    打造一个红旗(redflag)Linux的基础镜像(base image)「建议收藏」起因由于工作原因,想找一个红旗Linux的基础镜像(baseimage)。网上搜了一下,但没有现成的。起初是想找对应的centos版本来代替,但又怕有些莫名其妙的问题。官方文档不过搜索过程中,

    2022年7月2日
    42
  • java帝国的崛起[通俗易懂]

    java帝国的崛起[通俗易懂]1C语言帝国的统治现在是公元1995年,C语言帝国已经统治了我们20多年,实在是太久了。 1972年,随着C语言的诞生和Unix的问世,帝国迅速建立统治,从北美到欧洲,从欧洲到亚洲, 无数程序员臣服在他的脚下。帝国给我们提供了极好的福利:贴近硬件, 运行极快,效率极高。 使用这些福利…

    2022年9月24日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号