启动 class 函数作为线程丢失引用
Starting class functions as threads loosing reference
我正在开发一个 windows 程序,它在线程中完成了艰苦的工作
并且 GUI 停留在主循环中(在这种情况下我使用 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);
.
.
}
通常代码运行没有问题,
但是由于 pParams 引用 NULL
,其他例程和 job_a_threadstarter 中的一些更改正在崩溃
我在 x64 上使用 GNU G++ 和 mingw Windows
使用 c++11 开关编译并使用 -mwindows
链接
您正在传递指向局部变量 (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
我正在开发一个 windows 程序,它在线程中完成了艰苦的工作 并且 GUI 停留在主循环中(在这种情况下我使用 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);
.
.
}
通常代码运行没有问题, 但是由于 pParams 引用 NULL
,其他例程和 job_a_threadstarter 中的一些更改正在崩溃我在 x64 上使用 GNU G++ 和 mingw Windows 使用 c++11 开关编译并使用 -mwindows
链接您正在传递指向局部变量 (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