Я хочу передать объект класса в метод другого класса через вызов потока, я пытался, но получил ошибку, может ли кто-нибудь помочь мне в этом. Пожалуйста.
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 »: ни одна из двух перегрузок не может преобразовать все типы аргументов»
Может ли кто-нибудь подсказать мне, кому я могу передать объект sess функции в вызове потока и как я могу получить результаты из потока.
Спасибо за ваши ответы ..
Имеется ли такая опция, чтобы я мог вызывать функцию непосредственно в потоке, не вызывая автономную функцию потока, как я упоминал в моем коде [(HANDLE) _beginthreadex (0, 0, gen-> Добавление (ses_obj), (void *) 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);
...
}
Точка входа для потока не может быть методом класса. он должен быть статическим или иметь глобальный охват.
Вам нужно определить статический метод, как это
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);