Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

1

31.08.2010, 03:01

Funktionspointer von abgeleiteter Klasse in Mutterklasse

Ich weis das ich mir wahrscheinlich so langsam einen Namen mit sehr seltsamen Fragen mache, nichts desto trotz ... zum Problem ...

Als erstes denke ich ist ein Codeausschnitt gut ;) sonst versteht wohl niemand was ich meine bzw. bezwecken will.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<class T> 
class Thread 
{ 
typedef DWORD (T::*Sub)(LPVOID lpParam); 
private: HANDLE m_Handle; 
private: DWORD m_ID; 
public: Thread(Sub ptr) 
{ 
this->m_Handle = CreateThread(NULL, 0, *ptr , NULL, 0, &m_ID); 
} 
}; 
class ThreadA : public Thread<ThreadA> 
{ 
public: ThreadA() : Thread(&ThreadA::ThreadProc){} 
public: DWORD WINAPI ThreadProc(LPVOID lpParam) 
{ 
cout << "i'm the derived class ThreadA" << endl; 
return 0; 
} 
};




Also ... "Thread" soll eine allgemeine Basisklasse für Threads werden. Diese erhält als Standardparameter die Einsprungsadresse der abgeleiteten Klasse ... Wenn ich das ganze Compiliere erhalte ich allerdings den Fehler "

Konvertierung des Parameters 1 von 'DWORD (__stdcall ThreadA::* )(LPVOID)' in 'unsigned long (__thiscall ThreadA::* )(LPVOID)' nicht mglich"

Ich habe schonmal gegoogled nur da habe ich nur Antworten wie "C++ hat eine schlampige Implimentierung" gefunden. Und ich habe heraus gefuden das thiscall nichmal iwo definiert ist ... Danke MS :thumbsup:

Weis von euch wer wie sowas machbar ist ?

Mfg Zeus
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

idontknow

unregistriert

2

31.08.2010, 04:10

liegt vllt. an dem WINAPI?

3

31.08.2010, 09:17

Hi,

ich denke mal das hat was mit den "Calling conventions" zu tun. Sprich __stdcall und __thiscall.

Falls du keine Probleme mit Englisch hast solltest dir mal dies Einführung durchlesen. http://www.hackcraft.net/cpp/MSCallingConventions/

so long
Chris

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

31.08.2010, 09:40

Mehr oder weniger hat es GDChris ja schon gesag: Eine Memberfunktion ist keine einfache Funktion, deswegen kannst du sie auch nicht als ThreadProc benutzen. Der Trick ist eine normale (statische) Funktion als ThreadProc zu benutzen und dieser dein Objekt über den LPVOID Parameter zu übergeben sodass du dann in dieser Funktion die eigentliche Methode aufrufen kannst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (31.08.2010, 09:46)


Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

5

31.08.2010, 11:23

@GDChris: Danke für deine Antworten :) Ich les es mir mal durch.

@dot: dein Comi ist mir iwie schleiwehaft. Also eine statische Funktion versteh ich noch. Aber wie meinst du das mit "mein Objekt über den LPVOID Parameter zu übergeben" ? Also soll ich dann

C-/C++-Quelltext

1
2
3
4
5
6
 class bla
{
 ...
};
bla b;
ThreadA::ThreadProc(&b);


oder wie genau soll ich das verstehn ? Und irgentwie habe ich das Gefühl das es dann an dem vorbei läuft wo ich hin will.

graaz Zeus
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

31.08.2010, 11:48

Du brauchst aber ein Objekt um die Memberfunktion (Methode) aufrufen zu können. Daher wird das oft so gelöst (wie dot bereits erwähnte) das man eine statische Methode um die eigentliche Threadproc wrapped und als Parameter den Zeiger auf deine Instanz übergibt. Der Parameter wird i.A. im 4. Parameter von CreateThread() gesetzt.

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Thread
{
public:
    typedef DWORD (Thread::*ThreadProc_t)(LPVOID param);

    explicit Thread(ThreadProc_t threadProc)
        : m_proc(threadProc)
    {
        m_handle = CreateThread(NULL, 0, ThreadProc_, this, 0, NULL);
    }

    DWORD ThreadProc(LPVOID param)
    {
        // do something...

        return 0;
    }

private:
    static DWORD WINAPI ThreadProc_(LPVOID param)
    {
        Thread *inst = (Thread*)param;
        return (inst->*inst->m_proc)(NULL); /* oder einen weiteren parameter */
    }

    HANDLE m_handle;
    ThreadProc_t m_proc;
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    Thread x(&Thread::ThreadProc);

    return 0;
}
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (31.08.2010, 12:03)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

31.08.2010, 12:23

Vielleicht dazu noch ein Hinweis: Wenn du Visual C++ verwendest solltest du CreateThread() nicht direkt aufrufen sondern besser _beginthreadex() verwenden.

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

8

31.08.2010, 12:37

@David_pb: Danke, jetzt ist es klarer :)

@Dot: Ok, wird gemacht ;)

CLOSED
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

Werbeanzeige