Je suis un débutant en C# et je veux faire ce qui suit:méthode ne fonctionne pas lorsqu'il est exécuté dans un thread, mais fonctionne autrement - C#
Thread t = new Thread(new ThreadStart(this.play));
t.Start();
Ceci est la méthode play
:
private void play()
{
playSong("path\\to\\song.mp3");
}
private static void playSong(String path)
{
mciSendString("open \"" + path + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
mciSendString("play MediaFile", null, 0, IntPtr.Zero);
}
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
Quand j'exécute la méthode juste comme ceci: play();
, sans utiliser le filetage, la chanson joue parfaitement, mais elle ne joue pas si j'aime bien dans le premier extrait de code.
Je suppose que cela se produit parce que j'ai besoin d'appeler la méthode mciSendString
dans le thread principal. Si oui, quelqu'un me dira comment je peux faire ça? Ou dites-moi comment je peux le faire en utilisant un fil?
J'apprécie votre aide.
- Edité d'ici -
Je ne sais pas si je posterai le code, car il est un peu grande, mais je le réduire, pour montrer ce que je veux faire:
J'ai une application Windows Forms qui démarre un socket écoutant sur un port quand il commence, qui fonctionne comme un serveur. Ce serveur reçoit en tant que demandes les chemins vers les chansons qu'il va jouer. Si j'utilise la méthode play
comme indiqué ci-dessous, le formulaire se bloque, mais l'application continue d'écouter mes demandes. Je comprends que je dois le faire en arrière-plan, de sorte que les contrôles de formulaire ne planteront pas, je ne sais pas la meilleure façon de le faire.
//Constructor
public Main()
{
InitializeComponent();
play();
}
play()
est quelque chose comme ceci:
private void play()
{
//Does the socket initialization
do
{
//...
while (true)
{
//Reads text from client
//The text contains a string, indicating the path to the song.
byte[] bytesFrom = new byte[10025];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.Default.GetString(bytesFrom);
//Plays the song from the received path
playSong(dataFromClient);
//...Do other stuff
}
} while (_serverOn);
//Closes the socket connection
}
private static void playSong(String path)
{
mciSendString("open \"" + path + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
mciSendString("play MediaFile", null, 0, IntPtr.Zero);
}
Une chose à vérifier est que le fil est donné le temps de exécuter. Le thread principal doit être vivant pendant que celui-ci est en cours d'exécution. Pouvez-vous poster un exemple très simple ou le programme qui a l'erreur s'il vous plaît? –
Qu'arrive-t-il à votre thread principal après le démarrage du second thread? –
J'ai ajouté plus de détails à mon poste. J'espère que cela aide à résoudre mon problème. Merci! – AntonioJunior