Guten Abend!
Ich bin gerade dabei, ein Plugin (*.dll) für Winamp zuschreiben. Das
Plugin funktioniert auch schon sehr gut. Jetzt möchte ich es um einen
Thread erweitern, der dazu dienen soll, eine Funktion einige Sekunden
verzögert auszuführen.
Ich habe irgendwie das Gefühl, dass ich mich dabei recht dumm anstelle.
In C# hat es vor einiger Zeit super geklappt.
Ich habe in der Datei "AssemblyInfo.cpp"
using namespace System::Threading;
eingefügt.
In der Initfunktion möchte ich dann (wie in der MSDN) den Thread
deklarieren:
Thread^ oThread = gcnew Thread( gcnew ThreadStart(
&ThreadExample::ThreadProc ) );
Beim Kompilieren bringt er jedoch die Fehlermeldung "Error C2061:
Syntaxfehler: Bezeichner 'Thread'". Der Compiler kennt also den "Thread"
nicht als Datentyp.
Ich habe schon viel gesucht und ausprobiert. Aus irgendeinem Grund will
er aber die Deklaration nicht akzeptieren.
Vielleicht kann mir jemand etwas weiterhelfen. Ich hoffe, ich habe die
benötigten Infos angegeben.
Lg Raphael
@Sven: Ja - das scheint tatsächlich auf den ersten Blick zu
funktionieren. Weshalb ist das notwendig?
@Peter II: Also das Plugin funktioniert einwandfrei. War ein Demo-Plugin
von Winamp, das ich an meine Bedürfnisse angepasst habe.
Raphael M. schrieb:> Peter II: Also das Plugin funktioniert einwandfrei. War ein Demo-Plugin> von Winamp, das ich an meine Bedürfnisse angepasst habe.> In C# hat es vor einiger Zeit super geklappt.
warum machst du es dann nicht wieder in c#?
Hm - jetzt wirds sehr seltsam:
Ich möchte eine MP3 verzögert abspielen. Der Thread funktioniert jetzt
soweit - das habe ich mit einer Messagebox getestet.
Das ist der Inhalt meines Threads (zuerst 5 Sek. warten, dann Musik
abspielen)
System::Threading::Thread::Sleep(5000);
//MessageBox(NULL, L"TESSSSSSSSST.", L"", MB_OK);
mciSendString(L"open c:\\sound.mp3 alias mySound wait", NULL, 0, 0);
mciSendString(L"play mySound from 0", NULL, 0, 0);
Wie gesagt - der Thread wird aufgerufen und wartet brav seine 5 s ab, um
den Code anschließend auszuführen. Allerdings wird kein Sound
abgespielt.
Wenn ich die beiden letzten Zeilen (mciSendString) in die Funktion
kopiere, die den Thread startet, wird der Sound abgespielt.
Woran kann denn das liegen?!
Raphael M. schrieb:> Weil ich das fertige Winamp-Plugin nur bearbeite.
Und ist das, was Du da als Grundlage nimmst, nun C++ oder "C++/CLI" bzw.
"Managed C++"?
Tauchen bereits im vorliegenden Quelltext diese .Net-Dinge (mit ^) auf?
Raphael M. schrieb:> Hm - jetzt wirds sehr seltsam:>> Ich möchte eine MP3 verzögert abspielen. Der Thread funktioniert jetzt> soweit - das habe ich mit einer Messagebox getestet.>> Das ist der Inhalt meines Threads (zuerst 5 Sek. warten, dann Musik> abspielen)>> System::Threading::Thread::Sleep(5000);> //MessageBox(NULL, L"TESSSSSSSSST.", L"", MB_OK);> mciSendString(L"open c:\\sound.mp3 alias mySound wait", NULL, 0, 0);> mciSendString(L"play mySound from 0", NULL, 0, 0);>> Wie gesagt - der Thread wird aufgerufen und wartet brav seine 5 s ab, um> den Code anschließend auszuführen. Allerdings wird kein Sound> abgespielt.
Du solltest auf jeden Fall prüfen ob die MCI-Funktionen einen Fehler
zurückgeben.
> Wenn ich die beiden letzten Zeilen (mciSendString) in die Funktion> kopiere, die den Thread startet, wird der Sound abgespielt.>> Woran kann denn das liegen?!
Also ich würde mal raten dass MCI nicht in dem Sinne Thread-fähig ist,
wahrscheinlich muss da die Messageloop laufen - die ist per Thread. Um
eine Message von Thread A zu Thread B zu schicken sind dann Verrenkungen
nötig, genau wie bei normalen Fenster-Messages. Die Doku sollte dazu
etwas sagen.
Rufus Τ. Firefly schrieb:> Und ist das, was Du da als Grundlage nimmst, nun C++ oder "C++/CLI" bzw.> "Managed C++"?> Tauchen bereits im vorliegenden Quelltext diese .Net-Dinge (mit ^) auf?
Das Plugin ist das Demoplugin von dieser Seite:
http://wiki.winamp.com/wiki/Beginner's_Basic_Plugin_Guide
Dort kann man es auch - ohne es herunterzuladen - einsehen.
Das Projekt in Visual C++ wird wie folgt neu erstellt: C++ -> CLR ->
Class Library
Ich vermute, dass es sich um normalen C++ Code handelt, richtig?!
Jasch schrieb:> Also ich würde mal raten dass MCI nicht in dem Sinne Thread-fähig ist,> wahrscheinlich muss da die Messageloop laufen - die ist per Thread. Um> eine Message von Thread A zu Thread B zu schicken sind dann Verrenkungen> nötig, genau wie bei normalen Fenster-Messages. Die Doku sollte dazu> etwas sagen.
Genau mein Gedanke. Vielleicht blockiert der MCI-Aufruf auch nicht bis
die Nachricht gesendet wurde und die zweite Nachricht überholt die
erste.