Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 传递对象并从线程调用获取返回值_C++_Multithreading_Beginthreadex - Fatal编程技术网

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

C++ 传递对象并从线程调用获取返回值,c++,multithreading,beginthreadex,C++,Multithreading,Beginthreadex,我想通过一个线程调用将一个类对象传递到另一个类的方法中,我尝试了,但出现了错误。请任何人帮我一下 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); se

我想通过一个线程调用将一个类对象传递到另一个类的方法中,我尝试了,但出现了错误。请任何人帮我一下

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);

};
这是我的代码,我得到了一个类似“error C2665:“\u beginthreadex”:两个重载都不能转换所有参数类型的错误

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

谢谢你的回答

有没有任何选项可以让我直接在线程中调用函数而不调用独立的线程函数,就像我在代码[(HANDLE)\u beginthreadex(0,0,gen->addition(ses\u obj),(void*)0,0,0]中提到的那样]


我需要在线程中调用addition方法。在这方面,任何主体都可以帮助我。

这里的问题是,不是将函数传递给
\u beginthreadex
调用的对象,而是实际使用参数调用该函数,使用
Gen::addition
的返回值调用
\u beginthreadex
函数。这个结构当然不是一个函数,因此编译器会抱怨

不过,解决这一问题的办法并不简单。首先,因为独立函数(如
\u beginthreadex
所要求)与类成员函数不同。原因是所有类成员函数实际上都有一个“zeroeth”隐藏参数,该参数是类的一个实例,该类成为可在成员函数内使用的
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);

    ...
}
sess ses_obj(10);
myhandleA=(HANDLE)_beginthreadex(0, 0, ThreadEntry,(void*)&ses_obj, 0, 0);
struct call\u数据
{
sess sess_obj;
Gen*Gen_obj;
};
静态无效线程_函数(无效*数据)
{
调用数据*调用=重新解释转换(数据);
//执行实际的成员函数调用
调用->生成对象->添加(调用->附加对象);
}
int main()
{
...
call_data call={ses_obj,gen};
myhandleA=(HANDLE)\u beginthreadex(0,0,线程\函数和调用,0,0);
...
}

线程的入口点不能是类方法。它必须是静态的或在全局范围内

您需要像这样定义一个静态方法

static unsigned ThreadEntry(void* arg)
{
   sess *p = (sess*)arg;
   Gen::GetInstance()->addition(*p);
} 
然后像这样运行线程:

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);

    ...
}
sess ses_obj(10);
myhandleA=(HANDLE)_beginthreadex(0, 0, ThreadEntry,(void*)&ses_obj, 0, 0);

当发布关于编译错误的问题时,请将完整、完整和未编辑的错误消息放在问题中。这将使帮助您变得更容易。您可能想阅读,这将帮助您编写好的问题。您好,有没有任何选项可以让我直接在线程中调用函数,而无需调用独立线程就像我在代码中提到的[(HANDLE)\u beginthreadex(0,0,gen->addition(ses\u obj),(void*)0,0,0]@vamsikrishna没有。首先,您现在做的是在
\u beginthreadex
调用中调用成员函数。其次,因为成员函数与函数不同。我在回答中解释了所有这些。嗨,有没有任何选项可以让我直接在线程中调用函数而不调用独立线程函数。就像我在代码中提到的[(HANDLE)_beginthreadex(0,0,gen->addition(ses_obj),(void*)0,0,0)]否。但是你可以从类中调用静态函数。ThreadEntry可以是“static unsigned gen::ThreadEntry(void*arg){…}”,但它仍然是一样的。非常感谢你:)