मैं एक विंडोज़ प्रोग्राम पर काम कर रहा हूं, जो धागे में कड़ी मेहनत करता है और जीयूआई मुख्य लूप में रहता है (इस मामले में मैं इमगुई ओपनजीएल 3 का उपयोग करता हूं)

लेकिन अधिक कार्यों को लागू करने के साथ, वर्क_थ्रेड शुरू करते समय पैरामीटर दायरे से बाहर हो रहे हैं और स्टार्टथ्रेड द्वारा शुरू किए गए फ़ंक्शन को न्यूल को दिखाने वाला पॉइंटर प्राप्त होता है (वास्तव में कोड को बदलना नहीं बल्कि अन्य लाइब्रेरी समेत यह होता है कि ऐसा होता है)

क्या हो रहा है और इसे होने से कैसे रोका जाए

यहाँ मेरे कोड का एक कच्चा प्रतिनिधित्व है

#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 को संदर्भित कर रहा है

मैं एक x64 विंडोज़ पर mingw के साथ जीएनयू जी ++ का उपयोग कर रहा हूं, सी ++ 11 स्विच के साथ संकलन और -विंडो के साथ लिंक करना

0
alfetta 9 अक्टूबर 2018, 14:37

1 उत्तर

सबसे बढ़िया उत्तर

आप स्थानीय चर (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
1
rafix07 9 अक्टूबर 2018, 14:41