Передача объекта и получение возвращаемого значения из вызова потока

0

Я хочу передать объект класса в метод другого класса через вызов потока, я попытался, но получил ошибку, может ли кто-нибудь помочь мне в this.please.

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

Мне нужно вызвать метод добавления в потоке, чтобы любое тело помогло мне в этом.

Теги:
multithreading

2 ответа

2

Проблема здесь в том, что вместо передачи функции вызываемому _beginthreadex вы на самом деле вызываете эту функцию с аргументом, вызывая функцию _beginthreadex с возвращаемым значением из Gen::addition _beginthreadex. Эта структура, если курс не является функцией, и поэтому компилятор жалуется.

Однако решение этого непросто. Прежде всего потому, что автономная функция (по требованию _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);

    ...
}
  • 0
    Привет, есть ли такая опция, что я могу вызвать функцию непосредственно в потоке без вызова отдельной функции потока. Как я уже упоминал в моем коде [(HANDLE) _beginthreadex (0, 0, gen-> Добавление (ses_obj), (void) *) 0, 0, 0)]
  • 0
    @vamsikrishna Нет, нет. Прежде всего, то, что вы сейчас делаете, - это вызов функции-члена в вашем вызове _beginthreadex . Во-вторых, функции-члены не совпадают с функциями. Все это я объясняю в своем ответе.
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);
  • 0
    Привет, есть ли такая опция, что я могу вызвать функцию непосредственно в потоке без вызова отдельной функции потока. Как я уже упоминал в моем коде [(HANDLE) _beginthreadex (0, 0, gen-> Добавление (ses_obj), (void) *) 0, 0, 0)]
  • 0
    нет. но вы можете вызвать статическую функцию из класса. означает, что ThreadEntry может быть "статическим без знака Gen :: ThreadEntry (void * arg) {...}", но он все тот же.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню