Klassenfunktion mit Parameter als Thread
-
Moin!
Folgenden Code habe ich:
class cfunktion() { public: void addmessage(std::string stext); } int main() { // Wie muss ich die Funktion "addmessage" als Task hinschreiben? // ohne Parameter wäre es: // std::thread t1(&cfunktion::addmessage, &cfunktion); return 0; }Vielen Dank im Voraus!
-
Guten Abend @no_name1991
#include <iostream> #include <thread> #include <string> class Cfunktion { public: void addmessage(std::string stext) { std::cout << "Nachricht: " << stext << std::endl; } }; int main() { Cfunktion obj; // Wir brauchen ein Objekt der Klasse std::string msg = "Hallo Welt"; // Syntax: std::thread(Funktionsadresse, Objektadresse, Parameter1, Parameter2, ...) std::thread t1(&Cfunktion::addmessage, &obj, msg); t1.join(); // Warten, bis der Thread fertig ist return 0; }Hab Deine Frage an ne KI weitergegeben. So lernen wir und diese
.Wenn mehrere Threads die Methode aufrufen sollen, schau Dir auch mal "mutex" an.
-
@Helmut-Jakoby sagte in Klassenfunktion mit Parameter als Thread:
// Wir brauchen ein Objekt der Klasse
Das ist nicht korrekt.
Er kann einfach eine Lambda-Funktion verwenden, und in ihr die Funktion auf dem Objekt (std::thread / Cfunktion) aufrufen.
Ein ähnliches Thema gab es hier erst kürzlich. Dynamische Parameterbindung und so.
-
Das wäre dann in etwa wie folgt: https://www.c-plusplus.net/forum/post/2624561
-
Vielen Dank.
Die Antworten haben mir sehr geholfen.
-
Gerne möchte ich die Funktion als Thread ausführen und ihm neue Nachrichten zukommen lassen. Dafür habe ich 2 Funktionen. Leider wird zwar der Logger (zum Speichern angedacht) ausgeführt. Doch es werden keine neuen Nachrichten ausgegeben (/gespeichert).
Kann es an dem lock eventuell liegen?
void clogging::start() { std::cout << "logging start" << std::endl; while (1!=0) { if (mutex.try_lock()) { if(vsmessage.size()==0) { } else if(vsmessage.size()>0) { std::cout << vsmessage << std::endl; vsmessage.pop_back(); } else { } mutex.unlock(); } else { mutex.unlock(); } // for cpu and add new message mutex.unlock(); std::this_thread::sleep_for(500ms); } } void clogging::addmessage(std::string stext) { std::cout << "addmessage" << std::endl; while (true) { if (mutex.try_lock()) { std::cout << "job shared (" << " message " << ")\n"; vsmessage.push_back(stext); mutex.unlock(); return; } else { vsmessage.push_back(stext); std::cout << "job exclusive (" << " message " << ")\n"; } mutex.unlock(); std::this_thread::sleep_for(500ms); } }clogging logging; std::thread tlogging(&clogging::startA, &logging); tlogging.join(); std::string msg = "Hallo Welt"; std::thread t1(&clogging::addmessageA, &logging, msg); t1.join();Vielen Dank im Voraus!