gpt4 book ai didi

c++ - 使用私有(private)成员函数调用 Win32 QueueUserWorkItem()

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:51 26 4
gpt4 key购买 nike

我正在尝试使用 Win32 函数 QueueUserWorkItem() 调用一个私有(private)成员函数(不应以公共(public)或 protected 形式提供)作为工作项。我知道我以前做过这个并且很容易,但现在我找不到那个片段,我也不能使 bind() voodoo 工作。因此,出于这个问题的目的,该类是:

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 的分配应该是什么样的?

最佳答案

这似乎可行:

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

关于c++ - 使用私有(private)成员函数调用 Win32 QueueUserWorkItem(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com