Multithreading mit Parameter
-
Ich hätt mal ne kurze Frage zu dieser process.h - Multithreading Lib
Habe folgendes geschrieben:
class GlobalVariables { public: GlobalVariables(); ~GlobalVariables(); //... private: //... }//Funktion / thread void DisplayManager (void * GV) { // .....do something with GV } // in der main aufgerufen _beginthread(DisplayManager, 0, (void *) GV );Bekomme die Fehlermeldung:
- Der Ausdruck muss einen klassentyp aufweisen
- GlobalVariables kann nicht in *void konvertiert werdenWas habe ich falsch gemacht?
Lg Lars
-
Also GV ist ein solches Klassenobjekt und soll von der Main in den thread geschickt werden! Laut einem Internet-Tutorial soll das so gehen, ich kriegs aber nicht hin...
-
Dein Angaben sind ziemlich dürr, ich würde aber mal vermuten, dass du keinen Zeiger hast. Es müsste also so lauten:
_beginthread(DisplayManager, 0, (void *) &GV );
-
Ah ok das ist ein bisschen peinlich^^
Schonmal Danke für deine schnelle Hilfe!Wie verwende ich jetzt die Klasse in meinem Thread?
cout << GV.GetCurrentTemperature() << endl;oder
cout << (GlobalVariables) GV.GetCurrentTemperature() << endl;er scheint beide Varianten nicht zu kennen

-
Also hier mal etwas mehr Source-Code, damit mein Problem eventuell klarer wird:
//---------------------------------------------------- // Main - Funktion //---------------------------------------------------- int main () { Login(); bool forever = true; GlobalVariables GV; while (forever) { _beginthread(DisplayManager, 0, (void *) &GV ); Sleep(100); } _endthread(); return 0; }//---------------------------------------------------- // DisplayManager: wartet auf Tastendruck der Pfeile //---------------------------------------------------- void DisplayManager (void * GV) { char input = getch(); if(input == '1') { screen++; if (screen > 5) screen = 0; } else if(input == '2') { screen--; if (screen < 0) screen = 5; } else { cout << "Error: Unknown Input\n"; } if(screen == 0) { cout << "Temperatur-Ist-Wert\n"; //cout << (GlobalVariables) GV.GetCurrentTemperature() << endl; } else if(screen == 1) { cout << "Temperatur-Soll-Wert\n"; //cout << (GlobalVariables) GV.GetTargetTemperature() << endl; } else if(screen == 2) { cout << "Ventilator/Drehzahl\n"; } //......... } else if(screen == 5) { cout << "Admin: Ausschaltverz\x94gerung\n"; } else { cout << "Error: Unknown Screen\n"; } }class GlobalVariables { public: GlobalVariables(); ~GlobalVariables(); int GetCurrentTemperature() const {return CurrentTemperature;} void SetCurrentTemperature(int const & Val) { CurrentTemperature = Val;} private: int CurrentTemperature; };Hoffe der Code bringt klarheit über mein problem?
Danke für alle beiträge!
-
Lars, willkommen im Forum.
Lies dir bitte folgenden Link durch.Anschließend entferne dich schnell von diesem lächerlichen Internettutorial, dass dir nur falsche Grundlagen vermittelt, und hol dir ein gutes Buch.
Mehr kann man dazu auch nicht sagen.
-
//---------------------------------------------------- // DisplayManager: wartet auf Tastendruck der Pfeile //---------------------------------------------------- void DisplayManager (void * GV) { GlobalVariables gv = *(GlobalVariables*) GV; ... cout << gv.GetCurrentTemperature() << endl; ...
-
Das macht man mit static_cast in beiden Richtungen und bitte auch ohne das Kopieren des GlobalVariables-Objekts:
void DisplayManager (void * GVraw) { assert(GVraw); GlobalVariables gv = [b]static_cast<GlobalVariables*>[/b](GVraw); ... cout << gv->GetCurrentTemperature() << endl; ...
-
Hör auf eine nicht portable 20 Jahre alte "Bibliothek" zu verwenden und benutz lieber std::thread..
Dann musst du auch nicht irgendwelche unsinnigen C-Casts machen..
-
krümelkacker schrieb:
und bitte auch ohne das Kopieren des GlobalVariables-Objekts
Ich würde es kopieren, weil es in dem gezeigten Code nicht global ist (wie der Name ja vermuten lassen könnte), und ich mich nicht darauf verlassen würde, dass es solange lebt wie mein Thread.