我想通过一个线程调用将一个类对象传递给另一个类的方法,我试过但是得到了错误,任何人都可以帮我解决这个错误。
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-&gt; addition(ses_obj))中提到的那样, (void *)0,0,0)]
我需要在线程中调用add方法,任何正文都可以帮助我。
答案 0 :(得分:2)
这里的问题是,不是将函数传递给_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);
...
}
答案 1 :(得分:0)
线程的入口点不能是类方法。它必须是静态的或在全球范围内。
您需要定义一个像这样的静态方法
static unsigned ThreadEntry(void* arg)
{
sess *p = (sess*)arg;
Gen::GetInstance()->addition(*p);
}
并运行这样的线程:
sess ses_obj(10);
myhandleA=(HANDLE)_beginthreadex(0, 0, ThreadEntry,(void*)&ses_obj, 0, 0);