_beginthreadex static member function

前端 未结 5 1174
名媛妹妹
名媛妹妹 2021-01-24 02:28

How do I create a thread routine of a static member function

class Blah
{
    static void WINAPI Start();
};

// .. 
// ...
// ....

hThread = (HANDLE)_beginthre         


        
相关标签:
5条回答
  • 2021-01-24 03:05
    class Blah
    {
      public:
        static DWORD WINAPI Start(void * args);
    };
    
    0 讨论(0)
  • 2021-01-24 03:06

    Following is the compiling version:

    class CBlah
    {
    public:
        static unsigned int WINAPI Start(void*)
        {
        return 0;
        }
    };
    
    int main()
    {
        HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);
    
        return 0;
    }
    

    Following are the changes required:

    (1). Start() function should return unsigned int

    (2). It should take a void* as the parameter.

    EDIT

    Deleted point (3) as per comment

    0 讨论(0)
  • 2021-01-24 03:11
    class Blah
    {
        static unsigned int __stdcall Start(void *);
    };
    
    0 讨论(0)
  • 2021-01-24 03:16

    Sometimes, it is useful to read the error you're getting.

    cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'
    

    Let's look at what it says. For parameter three, you give it a function with the signature void(void), that is, a function which takes no arguments, and returns nothing. It fails to convert this to unsigned int (__stdcall *)(void *), which is what _beginthreadex expects:

    It expects a function which:

    • Returns an unsigned int:
    • Uses the stdcall calling convention
    • Takes a void* argument.

    So my suggestion would be "give it a function with the signature it's asking for".

    class Blah
    {
        static unsigned int __stdcall Start(void*);
    };
    
    0 讨论(0)
  • 2021-01-24 03:23
    class Blah
    {
        static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it.
    };
    

    The routine passed to _beginthreadex must use the __stdcall calling convention and must return a thread exit code.

    Implementation of Blah::Start:

    unsigned int __stdcall Blah::Start(void*)
    {
      // ... some code
    
      return 0; // some exit code. 0 will be OK.
    }
    

    Later in your code you could write any of the following:

    hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
    // or
    hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);
    

    In first case Function-to-pointer conversion will be applied according to C++ Standard 4.3/1. In second case you'll pass pointer to function implicitly.

    0 讨论(0)
提交回复
热议问题