gpt4 book ai didi

c++ - 传递对象并从线程调用中获取返回值

转载 作者:行者123 更新时间:2023-11-28 03:07:48 24 4
gpt4 key购买 nike

我想通过线程调用将一个类对象传递给其他类的方法,我试过了但出现错误,有人可以帮助我解决这个问题吗。请。

struct sample{

int status;

std::vector <std::string> a_row;

size_t column_count;

std::vector <std::string> column;

};

class sess {

public:

int a;

sess(int);

sess();

};

class Gen {

private:

static Gen* gen_obj;

public:

static bool Gen_InstanceFlag;

static Gen* GetInstance();

sample addition(sess);

};

/* 头文件结束 */

/* cpp文件的开头*/

include"Class_thread_mixing.h"

bool Gen::Gen_InstanceFlag=false;

Gen* Gen::GetInstance(){

if(!Gen::Gen_InstanceFlag){

Gen::gen_obj = new Gen();

Gen::Gen_InstanceFlag= true;

return gen_obj;

}
else {

return gen_obj;

}

}


sample addition(sess ses_obj){

sample sam;

sam.a_row.push_back("success");

sam.column.push_back("result");

sam.column_count=1;

sam.status=ses_obj.a;

return sam;
}


int main(int argc, char* argv[])

{

HANDLE myhandleA;

Gen* gen=Gen::GetInstance();

sess ses_obj(10);

myhandleA=(HANDLE)_beginthreadex(0, 0, gen->addition(ses_obj),(void*)0, 0, 0);

WaitForSingleObject(myhandleA, INFINITE);

CloseHandle(myhandleA);

getchar();

return 0;

}

这是我的代码,我收到类似“错误 C2665:'_beginthreadex':2 个重载都不能转换所有参数类型”的错误

谁能建议我在线程调用中将 sess 的对象传递给函数,以及如何从线程中获取结果。

感谢您的回答..

有任何选项可以让我直接在线程中调用函数而不调用独立的线程函数,就像我在代码中提到的 [(HANDLE)_beginthreadex(0, 0, gen->addition(ses_obj),(无效*)0, 0, 0) ]

我需要在线程中调用加法,任何人都可以帮助我。

最佳答案

这里的问题是,您不是将函数传递给 _beginthreadex 调用的函数,而是实际上调用带有参数的函数,从而导致 _beginthreadex 函数以 Gen::addition 的返回值调用。这个结构当然不是一个函数,所以编译器会报错。

虽然这个问题的解决方案并不简单。首先是因为独立函数(根据 _beginthreadex 的要求)与类成员函数不同。原因是所有类成员函数实际上都有一个“零”隐藏参数,并且是成为可在成员函数内部使用的 this 指针的类的实例。

最好的解决方案可能是创建一个独立的函数,它将一个指向结构的指针作为参数,该结构包含对象实例和实际成员函数的参数。

像这样:

struct call_data
{
sess sess_obj;
Gen* gen_obj;
};

static void thread_function(void* data)
{
call_data *call = reinterpret_cast<call_data*>(data);

// Do the actual member function call
call->gen_obj->addition(call->sess_obj);
}

int main()
{
...

call_data call = { ses_obj, gen };
myhandleA=(HANDLE)_beginthreadex(0, 0, thread_function, &call, 0, 0);

...
}

关于c++ - 传递对象并从线程调用中获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19271357/

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