multithreading
-
hey mädelz,
also, ich will ein proggie schreiben, dass die cpu-auslastung mit einigen berechnungen
in einer schleife beeinflusst. damit das programm dabei ansprechbar bleibt, will ich
multi-threading verwenden.die hauptklasse:
class CCpuMan { public: CCpuMan( BOOL Value = FALSE); virtual ~CCpuMan(); BOOL Start (); BOOL Stop (); private: static BOOL m_Stop; DWORD m_id; HANDLE m_Thread; time_t m_Time; UINT Manage ( LPVOID pParam); };
einige memberfunktionen:
BOOL CCpuMan::Start () { m_Thread = AfxBeginThread ( Manage, 0); return TRUE; } BOOL CCpuMan::Stop () { CloseHandle ( m_Thread); //alternativ durch setzten von m_Stop auf TRUE return TRUE; } UINT CCpuMan::Manage ( LPVOID pParam) { m_Stop = FALSE; while ( ! m_Stop) { //hier mat. berechnungen, um cpu-auslastung zu beinflussen } return 0; }
nun soll durch die funktion CCpuMan::Start () ein neuer thread ( CCpuMan::Manage) gestartet werden.
allerdings bekomme ich eine fehlermeldung:error C2665: 'AfxBeginThread' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden
allerdings klappt dieses verfahren bei einigen projekten, die ich auf einer buch-cd gefunden habe.
was mache ich falsch???
wenn einer irgendwas weiss -> ich warte
bis dann man, ich
PS: ich weiss, ich hab keine critsecs eingebaut, abba das sollte auch so laufen, da in jedem fall CCpuMan::Manage
nur daraus liest, nicht schreibt, und schreiben tut auch nur ein thread ( falls überhaupt,
eigentlich wollte ich den thread ja mit CloseHandle () schliessen)
-
kommt leute, lasst mich nich hängen
-
Du muss die Methode Manage als static deklarieren, damit diese in einem Arbeits-Thread ausgeführt werden kann. Außerdem führt dein CloseHandle-Aufruf zu einem Fehler.
-
ok, das mit dem static könnt klappen, hat das nich was damit zu
tun, dass man das dann auch ohne instanz von CWinThread irgendwie
ausführen kann???und was is dat mit CloseHandle und fehler???
habbi da irgendwas verrafft???bis dann man, cu
ich
-
so, ich hab das ma ausprobiert, abba geklappt hats leider nich.
ich hab die klasse jetzt so geändert:class CCpuMan { public: CCpuMan( BOOL Value = FALSE); virtual ~CCpuMan(); BOOL Start (); BOOL Stop (); private: static BOOL m_Stop; DWORD m_id; CWinThread* m_Thread; time_t m_Time; static UINT Manage ( LPVOID pParam); };
die funktion Manage () hab ich also als static deklariert:
static UINT CCpuMan::Manage ( LPVOID pParam) { m_Stop = FALSE; while ( ! m_Stop) { //mat. berechnungen } return 0; }
der neue thread scheint jetzt keine probleme mehr zu machen, dafür abba die
static-deklaration. ich bekomme folgende fehlermeldung:error C2724: 'Manage' : 'static' sollte nicht fuer Member-Funktionen verwendet werden,
die ausserhalb der Klasse definiert werdenalso hab ich die funktion in der klasse implementiert:
class CCpuMan { public: CCpuMan( BOOL Value = FALSE); virtual ~CCpuMan(); BOOL Start (); BOOL Stop (); private: BOOL m_Stop; DWORD m_id; CWinThread* m_Thread; static UINT CCpuMan::Manage ( LPVOID pParam) { time_t m_Time; while ( 1) { //mat. berechnungen } return 0; } };
jetzt klappt es fast wundebar ->
du hattest recht, ich kann den thread beenden. abba wie geht das?
weiss du dat???
naja, ich warte, bis dann man, ich
-
Hi, sorry dass ich jetzt erst antworte, aber vielleicht kann ich dir trotzdem noch helfen.
LUZA schrieb:
so, ich hab das ma ausprobiert, abba geklappt hats leider nich.
ich hab die klasse jetzt so geändert:class CCpuMan { public: CCpuMan( BOOL Value = FALSE); virtual ~CCpuMan(); BOOL Start (); BOOL Stop (); private: static BOOL m_Stop; DWORD m_id; CWinThread* m_Thread; time_t m_Time; static UINT Manage ( LPVOID pParam); };
die funktion Manage () hab ich also als static deklariert:
static UINT CCpuMan::Manage ( LPVOID pParam) { m_Stop = FALSE; while ( ! m_Stop) { //mat. berechnungen } return 0; }
der neue thread scheint jetzt keine probleme mehr zu machen, dafür abba die
static-deklaration. ich bekomme folgende fehlermeldung:error C2724: 'Manage' : 'static' sollte nicht fuer Member-Funktionen verwendet werden,
die ausserhalb der Klasse definiert werdenStatic darfst du auch nur im Prototypen verwenden, also in der Klassendeklaration. In der CPP muss das static weg.
du hattest recht, ich kann den thread beenden. abba wie geht das?
weiss du dat???
naja, ich warte, bis dann man, ich
Du kannst das durch Setzen deiner m_Stop-Variable machen. Elleganter ist es ein CEvent-Objekt zu benutzen.