Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Thread wait
Forum - C# / VB.NET - Thread wait

Avatar
fosforo (Normal User)
Expert


Messaggi: 366
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 17:17
Martedì, 21/09/2021
Ciao

Uso questo codice per visualizzare in un Panel il programma FFPLAY:

Codice sorgente - presumibilmente C# / VB.NET

  1. private void RunFFmpeg1()
  2.         {    
  3.             ffplay.StartInfo.FileName = "ffplay.exe";
  4.             ffplay.StartInfo.Arguments = "-noborder -volume 0 " +  "udp://127.0.0.1:2001";
  5.             ffplay.StartInfo.CreateNoWindow = true;
  6.             ffplay.StartInfo.RedirectStandardOutput = true;
  7.             ffplay.StartInfo.UseShellExecute = false;
  8.             ffplay.EnableRaisingEvents = true;
  9.             ffplay.OutputDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
  10.             ffplay.ErrorDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
  11.             ffplay.Exited += (o, e) => Debug.WriteLine("Exited", "ffplay");
  12.             ffplay.Start();
  13.  
  14.             Thread.Sleep(6000);
  15.  
  16.             SetParent(ffplay.MainWindowHandle, this.pane1RTmonitor.Handle);
  17.             MoveWindow(ffplay.MainWindowHandle, 0, 0, 480, 270, true);
  18.         }




Il problema è che per farlo funzionare correttamente c'è una istruzione che blocca la Form per alcuni secondi:
Thread.Sleep(6000);
Senza questo Sleep FFPALY non va nel Panel correttamente.

Sto cercando di gestire tutto in un Thread separato per non fermare il Form ma non riesco a gestire lo Sleep.

Se conoscete un altro modo di utilizzare FFPLAY incorniciato in un Panel, i consigli sono ben accetti.

Grazie anticipatamente

Ultima modifica effettuata da Thejuster il 23/09/2021 alle 11:57
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2105
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 11:52
Giovedì, 23/09/2021
Lo sleep ferma di saputo il Thread principale del programma.

Non è detto che poi serva per forza attendere quei 6 sec.

Codice sorgente - presumibilmente C# / VB.NET

  1. //Fai partire il processo
  2. ffplay.Start(); //1
  3.  
  4. //Attendi 6 sec
  5. Thread.Sleep(6000); //2
  6.  
  7. //Setti i vari handle
  8. SetParent(ffplay.MainWindowHandle, this.pane1RTmonitor.Handle); //3
  9.  
  10. //ancori il play all'handle principale del form
  11. MoveWindow(ffplay.MainWindowHandle, 0, 0, 480, 270, true); //4



Se inverti il processo?

Prima di eseguire ffplay.Start();
esegui tutte le altre operazioni?

Mi sembra strano che non ti crashi nemmeno l'applicazione in questo.
Generalmente il tutto và avviato una volta settato ogni parametro e non prima.

prova in questo modo. o altrimenti invia in un'altra void avviata in un processo diverso dal main dove fai attendere 6000ms e imposti i vari handle.

Codice sorgente - presumibilmente C# / VB.NET

  1. private void RunFFmpeg1()
  2.         {    
  3.             ffplay.StartInfo.FileName = "ffplay.exe";
  4.             ffplay.StartInfo.Arguments = "-noborder -volume 0 " +  "udp://127.0.0.1:2001";
  5.             ffplay.StartInfo.CreateNoWindow = true;
  6.             ffplay.StartInfo.RedirectStandardOutput = true;
  7.             ffplay.StartInfo.UseShellExecute = false;
  8.             ffplay.EnableRaisingEvents = true;
  9.             ffplay.OutputDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
  10.             ffplay.ErrorDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
  11.             ffplay.Exited += (o, e) => Debug.WriteLine("Exited", "ffplay");
  12.            
  13.             Thread t = new Thread(Avvia);
  14.             t.start();
  15.  
  16. }
  17.  
  18. private void Avvia()
  19. {
  20.  
  21.     invoke(new Action(delegate{
  22.  
  23.             ffplay.Start();
  24.  
  25.             Thread.Sleep(6000);
  26.  
  27.             SetParent(ffplay.MainWindowHandle, this.pane1RTmonitor.Handle);
  28.             MoveWindow(ffplay.MainWindowHandle, 0, 0, 480, 270, true);
  29.  
  30.    }));
  31.  
  32. }




Magari prima di testare questa soluzione (spero di averla scritta bene non ho testato)
prova prima a seguire il suggerimento sopra.


PM Quote
Avatar
fosforo (Normal User)
Expert


Messaggi: 366
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 8:50
Mercoledì, 29/09/2021
Ciao

Purtroppo non ho avuto risultati positivi.
Il programma non crasha, il problema è che FFMPEG non va nel Panel.
Rimane indipendente.

Anche solo cambiando il valore del Thread.Sleep(6000) diventa un problema.
Ho fatto dei test, e cambiando PC devo cambiare il valore del Thread.Sleep.
Diventa ingestibile.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2105
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:13
Mercoledì, 29/09/2021
Non sò, non dico che sbagli tu fosforo, non avendo mai provato ffmpeg in modalità video,
non posso azzardare conclusioni ma solo provare a dare qualche consiglio.

Ho utilizzato ffmpeg per convertire video, o audio. (le librerie ovviamente intendo)

per i video, ho fatto qualche esperimento con le DirectVideo, ma sono pochi i formati supportati dai codec nativi.

Da come ricordavo, bisognava assegnare un handle ovviamente come hai fatto nel tuo codice al draw,
per permettere alle directX di disegnare su quel determinato controllo, e solo dopo eseguire il play.

La cosa che non mi è chiara, è perché occorre attendere o congelare il thread per quei secondi.
Non sto dicendo che sbagli qualcosa, ma mi sembra un pò insensata come cosa.

Di conseguenza, leggendo:

Testo quotato


Ho fatto dei test, e cambiando PC devo cambiare il valore del Thread.Sleep.



Sono ancora più convinto che quel Thread Sleep non vada usato. Ma che bisogna eseguire magari il codice in un modo differente da quello.

Dove posso scaricare questo ffplay? magari provo a darti una mano e capire il problema.
Credo che bisogna in qualche modo comunicare con il processo esterno.

Ultima modifica effettuata da Thejuster il 29/09/2021 alle 18:20


PM Quote