kann nicht vom Typ void * (Klassenname :) () in den Typ void * (*) konvertieren (void *)

8
%Vor%

Ich versuche, einen separaten Thread zum Aufrufen einer Funktion auszuführen, weil er einen Aufruf von execl () verwendet und damit mein Programm beendet (ich bin auf Windows und kann fork () nicht verwenden). Die Kombination von Threading mit Klassen bereitet mir harte Zeiten.

Nach einigem Googeln habe ich verstanden, dass ich diese letzte Funktion als Freund oder Statik verwenden muss und eine Art von diesem Zeiger verwenden soll. Ich habe meinerseits versucht, aber Teile passen nicht zusammen. Ich bin sogar nicht in der Lage, den Fehlertyp zu ändern. Es frustriert mich jetzt. Den gleichen Fehler erhalten:

  

kann Scoreget :: basicgetscore nicht vom Typ void * (Scoreget ::) () in type void * (*) (void *)

umwandeln
    
vish213 20.08.2012, 18:29
quelle

3 Antworten

8

Deklarieren Sie es als statisch und fügen Sie eine weitere Hilfsmethode hinzu:

%Vor%

erstellt Pthread mit:

%Vor%

Seien Sie auch sehr vorsichtig. Sie geben diesem Thread die Adresse einer temporären Variablen. In diesem speziellen Fall ist es sicher, da pthread_join dieselbe Funktion hat. Wenn Sie jedoch vor dem Beenden des Threads von der Funktion zurückkehren, wird die Zuweisung des Objekts, in dem Sie den Thread ausführen, rückgängig gemacht, was zu allen möglichen Arten führen kann widerliches Verhalten. Erwägen Sie, Ihre Funktion auf 1) eine Referenz oder einen Zeiger oder 2) auf this zu aktualisieren.

    
Wug 20.08.2012, 18:36
quelle
6

Sie können die nicht statische Methode nicht an pthread_create

übergeben

Erstellen Sie am einfachsten eine statische Methode, die basicgetscore

ausführen würde

So ähnlich

%Vor%     
CyberDem0n 20.08.2012 18:35
quelle
0

Sie müssen eine (statische) Nichtmitgliedsfunktion definieren, die als Thread-Funktion für pthread_create() übergeben wird. Die Referenzierung von Ihrem Objekt hilft nicht, da dies ein Funktionszeiger ist, der von dieser Funktion erwartet wird. Sie können jedoch einen Zeiger auf Ihre Objektinstanz übergeben, indem Sie den Benutzer args void * pointer verwenden.

    
πάντα ῥεῖ 20.08.2012 18:36
quelle

Tags und Links