Запуск функций класса как потоков, теряющих ссылку - PullRequest
0 голосов
/ 09 октября 2018

Я работаю над программой Windows, которая выполняет тяжелую работу в потоках, а графический интерфейс остается в основном цикле (в этом случае я использую ImGui OpenGL3)

, но с реализацией большего количества функций параметрывыход из области видимости при запуске work_thread и функция, запущенная beginthread, получает указатель, показывающий NULL (на самом деле не изменение кода, а включение другой библиотеки провоцирует, что это происходит)

что происходит и как это предотвратить

здесь - грубое представление моего кода

#include <process.h>


class JOBS
{
public:
  void jobA(char *path);

};

void JOBS::jobA(char*path) {   . .     }


class APP_DATA
{
public:
  JOBS jobs;

public:
  char *path;
};



void job_a_threadstarter(void* pParams )
{
APP_DATA *app=*(APP_DATA **)  pParams;   

  app->jobs.jobA(app->path);  
}


void job_starter(APP_DATA *app)
{     
  _beginthread(job_a_threadstarter,0,&app);        
}



int main(int, char**)
{
APP_DATA app; 
char workpath[99]="path_to_somewhere";

    .
    .

  app.path=workpath;
  job_starter(&app);



    .
    .
}

, как правило, код выполняется без проблем, но некоторые изменения в других подпрограммах и job_a_threadstarter дают сбой, поскольку pParams ссылается на NULL

Я использую GNU G ++ с mingw на x64 Windows, компилирую с переключателем c ++ 11 и связываю с -mwindows

1 Ответ

0 голосов
/ 09 октября 2018

Вы передаете указатель на локальную переменную (app), которая уничтожается, когда job_starter заканчивается

_beginthread(job_a_threadstarter,0,&app); // you are getting pointer to local variable

замените его на

_beginthread(job_a_threadstarter,0,app); // forward pointer to app
...