 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 27.07.2002, 18:52 Titel: Aufrufkonvention im Zusammenhang mit Threads |
|
|
Hallo Leute,
Ich hab ein Problem bei der von Windows verwendeten Aufrufkonvention:
Und zwar möchte ich mit Hilfe von CreateThread einen neuen Arbeitsthread schaffen.
Dazu folgender Codeausschnitt (für Fragestellung angepasst):
Datei.h
Code: |
...
#include <windows.h>
#include <process.h>
class CKlasse {
private:
...
HANDLE m_hRunMutex;
HANDLE m_hThreadMutex;
...
VOID Render(VOID *Params);
public:
CKlasse();
virtual ~CKlasse();
...
BOOL Run();
...
};
...
|
Datei.cpp
Code: |
VOID CKlasse::Render(VOID *Params) {
// Diese Funktion läuft in einem eigenem Thread.
WaitForSingleObject(m_hThreadMutex, INFINITE);
while(WaitForSingleObject(m_hRunMutex, 75L)==WAIT_TIMEOUT) {
// Hauptrenderschleife
}
ReleaseMutex(m_hThreadMutex);
}
CKlasse::CKlasse() {
...
m_hRunMutex=CreateMutex(NULL, FALSE, NULL);
m_hThreadMutex=CreateMutex(NULL, FALSE, NULL);
}
CKlasse::~CKlasse() {
...
CloseHandle(m_hRunMutex);
CloseHandle(m_hThreadMutex);
}
BOOL CKlasse::Run() {
MSG msg;
DWORD ThreadID;
WaitForSingleObject(m_hRunMutex, INFINITE);
CreateThread(NULL, 0, Render, 0, 0, &ThreadID);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
ReleaseMutex(m_hRunMutex);
WaitForSingleObject(m_hThreadMutex, INFINITE);
return(TRUE);
}
...
|
Beim Kompilieren bekomme ich jetzt folgende Fehlermeldung:
Datei.cpp(82) : error C2664: 'CreateThread' : Konvertierung des Parameters 3 von 'void (void *)' in 'unsigned long (__stdcall *)(void *)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein
Wie muß ich die Funktion Render in der Klasse deklarieren, damit sie mit __stdcall Kompatibel ist?
PS.: Die gleiche Fehlermeldung erhalte ich auch, wenn ich statt CreateThread _beginthread verwende.
Dann heißt die dazugehörige Codezeile:
Code: |
_beginthread(Render, 0, NULL);
|
_________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 27.07.2002, 19:03 Titel: |
|
|
Das kannst du so leider nicht machen... du musst einen "Trick" anwenden:
Code: |
statid DWORD WINAPI RenderProcedure(CKlasse * pInst)
{
// Du musst den Prototyen von Render in 'DWORD Render(VOID *Params);' umändern
return pInst->Render();
}
...
// Dann innerhalb von ::Run()
...
CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE) RenderProcedure,
this,
0,
&ThreadID);
...
|
Ich hoffe das hilft dir weiter... _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 27.07.2002, 20:15 Titel: |
|
|
Das hat vorausgesetzt, daß ich CKlasse::Render() public mache und das ich eine Funktion RenderProcedure in die Datei von CKlasse mit einbauen mußte.
Es Funktioniert zwar so, untergräbt aber das Konzept der Kapselung und der Geheimhaltung... Wollte ich eigendlich Verhindern.
So ein Ähnliches Problem hatte ich ja auch schon, als ich die WndProc-Funktion in die Klasse mit aufnehmen wollte. Ging auch nicht
Ach ja, was gebe ich denn am Besten für einn Wert bei Render zurück?
Hat der DWORD irgendeine weitere Bedeutung? Derzeit hab ich am Ende von CKlasse::Render() nur ein return(0); geschrieben. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 27.07.2002, 20:36 Titel: |
|
|
return 0; ist okay... Das ist halt nur der Exit-Code für die Funktion.
Ich bin mir nicht sicher ob das geht aber: Mach 'RenderProcedure' zu einer Freund-Funktion von CKlasse.
Ich habe 'friend' noch nie benutzt und weiß nur das es unter Klassen geht und nicht bei Klasse/Funktion... CHRISTIAN!?!  _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 27.07.2002, 20:54 Titel: |
|
|
Hi,
http://www.informatik.uni-halle.de/lehre/c/c_friend.html
dort müsste eigentlich alles über friend stehen!
Aber Achtung: Das verwenden von friend gehört nicht unbedingt zum guten Stil, kann durch gelegentliche Verwendung aber vieles vereinfachen!
ciao MiracleBoy  |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 27.07.2002, 21:04 Titel: |
|
|
Jo also das mit mit friend geht ja dann
Und in diesem Fall ist es ein guter Stil, weil dadurch die Kapselung gerettet wird und die Funktion ja im Prinzip NUR zu dieser Klasse gehört.
Also... Freunde gewinnen!!  _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 27.07.2002, 21:22 Titel: |
|
|
Wollte nur sagen das man's nicht Übertreiben muss!  |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 27.07.2002, 22:56 Titel: |
|
|
Von Freunden hab ich schon ein paar mal gehört, nur benutzt hab ich sie noch nie, weil wie gesagt das ganze nicht gerade von gutem Stil zeugt...
Ich lese es mir trotsdem mal durch.
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 28.07.2002, 12:58 Titel: |
|
|
Eben! Schliesslich sollen die Klasen ja möglichst unabhängig sein und nicht verkoppelt(das wäre ja eigentlich nicht der Sinn von OOP!).
Aber trotzdem:Ausnahme erlaubt
Miracleboy  |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 30.07.2002, 06:37 Titel: |
|
|
Ich sagte doch schon: In diesem Fall _IST_ es ein guter Stil.
a.) Die Kapselung der Klasse CKlasse wird gerettet
UND
b.) Es werden keine Klassen verkoppelt nur eine Klasse und eine Funktion. Und diese Funktion musst du nichteinmal manuell ausführen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|