_beginthreadex 创建线程

2021-04-14  本文已影响0人  小小怪吃吃吃

1 语法

uintptr_t _beginthreadex( // NATIVE CODE
   void *security,
   unsigned stack_size,
   unsigned ( __stdcall *start_address )( void * ),
   void *arglist,
   unsigned initflag,
   unsigned *thrdaddr
);

2 参数

3 返回值

如果成功,则这些函数中的每一个都会返回一个句柄到新创建的线程;但是,如果新创建的线程退出过快,则_beginthread 可能不会返回有效句柄。

4 使用实例

unsigned int nThreadID = 0;
m_hGetOneFrameHandle[i] = (void*) _beginthreadex( NULL , 0 , WorkThread , this, 0 , &nThreadID );
if (NULL == m_hGetOneFrameHandle[i])
{
    ShowErrorMsg(TEXT("Create thread fail"), 0);
}
// ch:工作线程 | en:Working thread
unsigned int    __stdcall   WorkThread(void* pUser)
{
    if (NULL == pUser)
    {
        return -1;
    }

    CMultipleCameraDlg* pCam = (CMultipleCameraDlg*)pUser;
    if (NULL == pCam)
    {
        return -1;
    }
    int nUsingCameraNum = pCam->m_nUsingCameraNum;
    pCam->m_nUsingCameraNum = -1;       
    pCam->ThreadFun(nUsingCameraNum);

    return 0;
}

注意:

  • 在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是 C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。
  • 所以,如果你的编程只调用 Win32 API/SDK ,就放心用 CreateThread;如果要用到
    C++ 运行时间库,那么就要使用 _beginthreadex ,并且需要在编译环境中选择 Use
    MultiThread Lib/DLL。
  • 线程handle因为是内核对象,所以需要在最后closehandle。

QT多线程

参考:
1、https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/beginthread-beginthreadex?view=msvc-160
2、https://www.cnblogs.com/MCSFX/p/13180726.html

上一篇 下一篇

猜你喜欢

热点阅读