ausführen von threads der Klasse member-Funktion in c++
Als der Titel sagt.
Das folgende ist meine code-Skelett.
class CLASS
{
public:
void A();
private:
DWORD WINAPI B(LPVOID);
};
void CLASS::A()
{
DWORD (WINAPI CLASS::*thread)(LPVOID) = &CLASS::B;
...
CreateThread(NULL, 0, thread, &arg, 0, NULL);
...
}
die Funktion B muss KLASSE member-Variablen.
Aber ich habe einen Fehlercode, wenn ich zusammengestellt.
Es " kann nicht konvertieren argument 3 von 'DWORD (__stdcall CLASS::* )(LPVOID)' in 'LPTHREAD_START_ROUTINE' " oder so ähnlich.
Ich weiß nicht, ob es ist das gleiche in der englischen Umgebung.
kann jemand bitte helfen?
InformationsquelleAutor superscalar | 2011-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ernst, die Verwendung von std::thread (oder boost::thread, wenn Ihr compiler nicht unterstützt, ist es noch):
boost::thread t(&CLASS::B, this, your args if any go here);
. So einfach ist das.danke!!! behoben.
InformationsquelleAutor ybungalobill
Haben Sie zum definieren der callback-Funktion als
static
Funktion, wenn es die member-Funktion!Besseres design : definieren Sie eine wiederverwendbare Klasse!
Aus meiner Vorherige Antwort: (mit kleiner änderung)
Noch besser wäre es, zu definieren, eine wiederverwendbare Klasse mit rein virtuellen Funktion
run()
umgesetzt werden, indem die abgeleiteten thread Klassen. Hier ist, wie es gestaltet sein sollte:du meinst CRTP?
+1, aber ich würde die
run
Methode geschützt.guter Punkt. bearbeitet meine post. vielen Dank 🙂
Es ist ein wenig altmodisch und umständlich design zu haben, um das ableiten einer Klasse und überschreiben einer Funktion zum ausführen einer thread. Besser ist die Verwendung von boost::thread oder einen ähnlichen Mechanismus, der nimmt einen Funktor als thread-Funktion und erfordert keine Ableitung von etwas.
InformationsquelleAutor Nawaz
Haben Sie zu machen, dass die Funktion
static
.Das problem hier ist, dass jedes nicht-statische member-Funktion ist eine implizite
this
parameter und das ist in der Tat, was der compiler versucht, Ihnen zu sagen - Ihre nin-statische member-Funktion hat die Signatur unterscheidet sich von der, die Sie erwartet.Siehe auch diese Antwort auf eine eng Verwandte Frage.
func(classname *this, ...)
, die Zeiger-Darstellung ist sonderbar - in einigen Fällen-Klasse member-Funktion-Zeiger können am Ende wird 2x die Größe einer normalen Funktion Zeiger, so denken Sie nicht einmal zwingen, den Guss 🙂InformationsquelleAutor sharptooth