Forum: PC-Programmierung Hilfe zu Thread


von X_Rider (Gast)


Lesenswert?

Guten Morgen, ich verstehe die my_Thread Funktion nicht richtig.
Was geschieht hier: Thread* pthis=(Thread*)para;
und hier: pthis->ThreadFunction(pthis->callback);
1
DWORD WINAPI Thread::my_Thread(void* para)
2
{
3
    Thread* pthis=(Thread*)para; // ?
4
  if(pthis!=NULL)
5
  {
6
    pthis->ThreadFunction(pthis->callback);
7
    return 0;
8
  }
9
  return -1;
10
}
11
12
Headerdatei Thread.h
13
14
class Thread
15
{
16
 private:
17
      
18
 public:
19
         ....
20
         ....
21
22
         void* callback
23
24
  virtual void ThreadFunction(void*)=NULL;
25
26
27
  Thread();
28
  ~Thread();
29
 
30
 protected:
31
32
  static DWORD WINAPI my_Thread(void* para);
33
};

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Funktion my_Thread ist eine statische Memberfunktion, innerhalb 
derer kein this-Pointer bekannt ist. Um nichtstatische Memberfunktionen 
aufrufen zu können oder um auf Membervariablen der Objektinstanz 
zugreifen zu können, ist dieser this-Pointer aber zwingend erforderlich.
Also wird der CreateThread/_beginthread als opaker Parameter übergeben 
und landet als nach wie vor opaker Parameter in my_Thread.

  Thread* pthis = (Thread *) para;

erzeugt daraus einen pseudo-this-Pointer "pthis", der Dereferenzierungen 
zulässt. (Das ist ein C-Typecast, C++-Freunde werden da sicherlich 
aufheulen.)

Damit die Threadfunktion virtuell überladen werden kann (wozu man das 
auch immer hier benötigen möge), wird aus der statischen über den 
pseudo-this-Pointer "pthis" ebenjene virtuell überladbare aufgerufen:

  pthis->ThreadFunction(pthis->callback);


Wozu die Membervariable "callback" dient, wirst Du der Implementierung 
entnehmen müssen.


Haben wir dieses Thema nicht bereits vor ein paar Tagen breitgetreten?

von X_Rider (Gast)


Lesenswert?

Hi Rufus, danke nochmals!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.