JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Aufrufkonvention im Zusammenhang mit Threads

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 18:52    Titel: Aufrufkonvention im Zusammenhang mit Threads Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 19:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 20:15    Titel: Antworten mit Zitat

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 Sad

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 20:36    Titel: Antworten mit Zitat

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!?! Very Happy
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 20:54    Titel: Antworten mit Zitat

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 Cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 21:04    Titel: Antworten mit Zitat

Jo also das mit mit friend geht ja dann Smile
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. Smile

Also... Freunde gewinnen!! Wink
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 21:22    Titel: Antworten mit Zitat

Wollte nur sagen das man's nicht Übertreiben muss! Razz Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 27.07.2002, 22:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 28.07.2002, 12:58    Titel: Antworten mit Zitat

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 Exclamation Razz
Miracleboy Cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 30.07.2002, 06:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum