Probleme beim Starten eines Threads

DannyP

Mitglied
Hallo :)

Ich habe ein Projekt mit mehrern Klassen. In einer Klasse soll die Funktion in einer zweiten Klasse als Thread aufgerufen werden. Dazu habe ich die _beginthread() Funktion verwendet. Wenn ich das Projekt kompiliere, bekomme ich allerdings nur folgende Fehlermeldung:
"error C2664: '_beginthread': Konvertierung des Parameters 1 von 'void (void *)' in 'void (__cdecl *)(void *)' nicht möglich"

Der Prototyp der Funktion die ich per Thread starten möchte sieht so aus:
void cSound::play(void);

_beginthread rufe ich so auf:
_beginthread(this->sound.play, 0, NULL);

Dabei ist sound die Klassenvariable die ich in der ersten Klasse definiert habe. Die Funktion paly der Klasse ist in der anderen Klasse korrekt definiert. Wenn ich das Projekt ohne Threads erstelle, funktionieren alle Funktionen auch, aber ich benötige Threads um mehrere Aktion gleichzeitig auszuführen.
Ich habe in meinen Projekteinstellungen auch auf "Multithreaded" umgestellt und auch die process.h includet.

Nun noch eine Frage: _beginthread() gibt's ja nicht für Linux, was muss ich da verwenden und kann ich das evtl. auch für Windows benutzen?

Vielen Dank im Voraus
Daniel
 
Dein Sound.Play ist eine Memberfunktion einer Klasse, da ist ein Unterschied.

Bei Memberklassen wird intern ein this-Pointer auf die Klasseninstanz mitgegeben, deshalb lässt sich das nicht so einfach machen.Du könntest die Play-Funktion static machen, aber das ist wahrscheinlich nicht, was du willst.

Eine Möglichkeit wäre, die Funktion statisch zu machen und als den Startparameter einen Pointer auf die cSound-Klasse mitzugeben. In der statischen Play-Funktion castest du den Parameter auf cSound* und rufst die tatsächliche Abspielroutine auf.
 
Hallo,

Vielen Dank für die Antwort.
Ich glaube ich habe deinen Vorschlag aber nicht richtig verstanden, bzw. nicht richtig umgesetzt.

Ich habe mir eine neue Funktion erstellt:
static void StartSound(cSound Snd);
und in dieser Funktion dann die Abspiel Funktion aufgerufen.
Diese StartSound Funktion habe ich bei _beginthread als erstes argument angegeben und auch die nachfolgenden Parameter entsprechend angepasst.

Aber es erscheint immer noch diese Fehlermeldung.

Kannst du mir vielleicht ein kurzes Beispiel geben, wie du das meinst?

Vielen Dank im Voraus
Viele Grüße
Daniel
 
Code:
// im Header
static void cSound::StartSound( void* lpParam );

// in der .cpp
void cSound::StartSound( void* lpParam )
{

  cSound*  pSound = (cSound*)lpParam;

  pSound->Play();

}

und zum Aufrufen:
Code:
cSound   meinSound;

// ... Sound initialieren oder wasauchimmer(TM)...

_beginthread( StartSound, 0, &meinSound );

Sollte schon ausreichen
 
Hallo,

vielen Dank :)
Nun kann ich das in einem Thread aufrufen, aber es hat leider nicht ganz den geünschten Effekt. Ich kann zwar nun ein Lied abspielen, aber in der Zeit in der das Lied spielt, kann ich kaum andere Aktionen ausführen. Wenn ich z.B. auf einen Menüpunkt klickt, dauert es eine halbe Ewigkeit, bis sich das Menü geöffnet hat und dann nochmal lange, bis die Aktion ausgeführt wurde. Muss ich die Menüaktionen und so dann auch in einen Thread packen oder mach ich was anderes falsch?

Viele Grüße
Daniel
 
Was benutzt du da eigentlich zum Abspielen? Sowohl das Win32 PlaySound als auch DirectSound sowie eigentlich jede andere Sound-Library, die ich kenne, spielt Sounds asynchron ab, also ohne den Rest zu hängen.
 
Hallo,

ich verwende die audiere Library zur Wiedergabe. Ich rufe die Playfunktion dazu ja in einer Memberfunktion der cSound Klasse auf. Das abspielen läuft auch asynchron, stoppt allerdings sobald die funktion beendet wird. Deshalb verzögere ich das Beenden der Funktion über eine while Schleife, bis das Lied zu ende ist. Während dieser Zeit sollen aber auch andere aktionen möglich sein, z.B. Playlistverwaltung oder nächsten Lied auswählen o.ä.

Grüße
Daniel
 
Zurück