2

Win32 関数を使用してワーカー アイテムとしてプライベート メンバー関数 (パブリックまたはプロテクトとして使用可能であってはなりません) を呼び出そうとしていますQueueUserWorkItem()。以前にこれを行ったことがあり、簡単だったことは知っていますが、今ではそのスニペットを見つけることができず、bind()ブードゥーを機能させることもできません. したがって、この質問の目的のために、クラスは次のとおりです。

class Arbitrary {

    public:
        Arbitrary() ;
        ~Arbitrary() ;

        bool    UsefulPublicFunction(unsigned uParameter) ;

    protected:

    private:
        void    PrivateWorkItem(void* pVoid) ;
} ;

内部UsefulPublicFunction()には次のように表示されます。

LPTHREAD_START_ROUTINE pThreadStartRoutine ;
ULONG uFlags = 0 ;
void* pContext = nullptr ;

if (QueueUserWorkItem(pThreadStartRoutine, pContext, uFlags)) {
    //blah blah blah
}

私が雑草に夢中になっているように見えるのは、次のpThreadStartRoutineようなものへの割り当てです。

pThreadStartRoutine = std::bind<&Arbitrary::PrivateWorkItem, this, std::placeholders::_1> ;

PrivateWorkItemおそらく署名を次のように変更する必要があることを認識しています。

private:
    DWORD   WINAPI  PrivateWorkItem(void* pVoid) ;

その変化があっても、喜びはありません。VS2015 は、私が使用している方法が本当に嫌いですbind()

私の課題はpThreadStartRoutineどのように見えるべきですか?

4

2 に答える 2

2

This seems to work:

#include <Windows.h>

#include <stdio.h>

#include <functional>

using namespace std::placeholders;

class Arbitrary {

    public:

        bool UsefulPublicFunction(int uParameter);

    protected:

    private:
        typedef std::function<void (void)> CallbackType;
        static DWORD WINAPI ProcessWorkItem(void* pVoid);
        void PrivateWorkItem1(int arg1, int arg2);
        void PrivateWorkItem2(char * arg1);
};

void Arbitrary::PrivateWorkItem1(int arg1, int arg2)
{
    printf("Numbers are %u %u\n", arg1, arg2);
    return;
}

void Arbitrary::PrivateWorkItem2(char * arg1)
{
    printf("String is %s\n", arg1);
    return;
}

DWORD WINAPI Arbitrary::ProcessWorkItem(void* pVoid)
{
    CallbackType * callback = static_cast<CallbackType *>(pVoid);
    (*callback)();
    delete callback;
    return 0;
}

bool Arbitrary::UsefulPublicFunction(int param1)
{
    QueueUserWorkItem(&ProcessWorkItem, new CallbackType(std::bind(&Arbitrary::PrivateWorkItem1, this, param1, 7)), 0);

    QueueUserWorkItem(&ProcessWorkItem, new CallbackType(std::bind(&Arbitrary::PrivateWorkItem2, this, (char *)"This is my string")), 0);

    Sleep(1000);
    return true;
}

int main(int argc, char ** argv)
{
    Arbitrary x;

    x.UsefulPublicFunction(5);

    return 0;
}
于 2016-04-15T06:23:44.103 に答える
1

代わりに、次のようなことを試してください。

class Arbitrary {

    public:
        Arbitrary() ;
        ~Arbitrary() ;

        bool UsefulPublicFunction(unsigned uParameter);

    protected:

    private:
        static DWORD WINAPI PrivateWorkItem(void* pVoid) ;
        void PrivateFunction();
} ;

DWORD WINAPI Arbitrary::PrivateWorkItem(void* pVoid)
{
    static_cast<Arbitrary*>(pVoid)->PrivateFunction();
    return 0;
}

...

if (QueueUserWorkItem(&PrivateWorkItem, this, 0)) {
    //blah blah blah
}
于 2016-04-14T22:34:21.260 に答える