zoukankan      html  css  js  c++  java
  • C++实现多线程类Thread

    Windows编程中创建线程的常见函数有:CreateThread、_beginthread、_beginthreadex。据说在任何情况下_beginthreadex都是较好的选择。

    _beginthreadex的参数虽然多,但是大部分填NULL或0使用默认值就可以了。

    1     uintptr_t __cdecl _beginthreadex(void * _Security, unsigned _StackSize,
    2         unsigned(__stdcall * _StartAddress) (void *), void * _ArgList,
    3         unsigned _InitFlag, unsigned * _ThrdAddr);

    成功时返回线程句柄,失败时返回NULL。

    各个参数的含义:

    1. _Security:线程安全相关信息,默认时传递NULL。
    2. _StackSize:要分配给线程的栈大小,传递0时生成默认大小的栈。
    3. _StartAddress:传递给线程的主函数信息。
    4. _ArgList:调用main函数时传递的参数信息。
    5. _InitFlag:用于指定线程创建后的行为,传递0时,线程创建后立即进入可执行状态。
    6. _ThrdAddr:用于保存线程ID的变量地址值。

    通常只要指定_StartAddress与_ArgList的值就可以了,其他参数直接使用默认值。

    _StartAddress是一个返回值为unsigned的WINAPI函数。

    我们要实现一个C++的多线程基类,用户在派生类中重载run方法,然后调用start方法来开始线程。

    如果直接将类中的run方法作为线程的主函数参数传递的话,会有编译错误提示,表示类型与_StartAddress不符。

    这是因为类中的方法都有一个隐含的参数this指针。

    我们可以通过一个静态方法agent来避开隐含的参数this指针,并将this指针作为直接的参数传递给它。

    在agent方法中,通过this指针调用类中的run方法。

    完整实现:

     1     class Thread {
     2     public:
     3         void start();
     4         virtual unsigned run();
     5         HANDLE getThread();
     6     private:
     7         HANDLE hThread;
     8         static unsigned WINAPI agent(void *p);
     9     };
    10     void Thread::start() {
    11         hThread = (HANDLE)_beginthreadex(NULL, 0, agent, (void*)this, 0, NULL);
    12     }
    13     unsigned Thread::run() {
    14         puts("Base Thread");
    15         return 0;
    16     }
    17     unsigned WINAPI Thread::agent(void *p) {
    18         Thread *agt = (Thread*)p;
    19         unsigned res = agt->run();
    20         return res;
    21     }
    22     HANDLE Thread::getThread() {
    23         return hThread;
    24     }

    在Thread类的派生类中,只要重载run(),就可以实现多线程了。

  • 相关阅读:
    requestWindowFeature()的应用(转载)
    Android美工坊selector选择器的使用(转载)
    Activity强制横屏竖屏
    ActivityGroup的简单用法(2)Demo展示讲解
    AndroidGUI25:定制Activity的标题栏(Titlebar)(转载)
    android背景选择器selector用法汇总
    eclipse的注释字体大小如何修改?不改变代码的字体
    QML基础——QML国际化(中文示例)
    QML基础——在C++程序中使用QML
    App for Android (4) —— Eclipse篇
  • 原文地址:https://www.cnblogs.com/zinthos/p/3967229.html
Copyright © 2011-2022 走看看