Forum: PC-Programmierung Thread Programmierung mit VS2010/C++


von Raphael M. (Gast)


Lesenswert?

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

von Sven H. (dsb_sven)


Lesenswert?

Hast du mal System::Threading.Thead als Typ versucht?

von Peter II (Gast)


Lesenswert?

kann man denn überhaupt eine dll für winamp mit .net programmieren? Ja 
das was du machst ist kein C++, sondern c++.net.

von Raphael M. (Gast)


Lesenswert?

@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.

von Peter II (Gast)


Lesenswert?

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#?

von Raphael M. (Gast)


Lesenswert?

Weil ich das fertige Winamp-Plugin nur bearbeite. Keine Ahnung, ob man 
das auch in C# umstricken kann.

von Raphael M. (Gast)


Lesenswert?

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?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Jasch (Gast)


Lesenswert?

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.

von Raphael M. (Gast)


Lesenswert?

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?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sieht in der Tat nach richtigem C++ aus, und nicht nach der 
MS-Mutation "Managed C++/CLI".

von Raphael M. (Gast)


Lesenswert?

Das bedeutet für mich, ich kann das Threading anders machen?

Wobei es so wie ich es habe - .Net spezifisch - jetzt jedenfalls 
funktioniert.

von Zerf (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
Lade...