Вызов Win32 QueueUserWorkItem () с закрытой функцией-членом

Я пытаюсь вызвать закрытую функцию-член (не должна быть доступна как открытая или защищенная) как рабочий элемент с функцией 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 выглядит как?

2

Решение

Это похоже на работу:

#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;
}
2

Другие решения

Попробуйте что-то более похожее на это:

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
}
1

По вопросам рекламы [email protected]