PDA

View Full Version : C# Problema cross thread


millennio
05-05-2011, 11:50
Task.Factory.StartNew(() =>
{
listBox1.Items.Add("converto");
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "ffmpeg";
proc.StartInfo.Arguments = " -i " + ultimo_file + " -target pal-dvd " + percorsoMPEG + zeri + numfiles2 + "_" + lbldataeora.Text + ".mpg";
proc.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; //nasconde la finestra dos
proc.Start();
proc.WaitForExit();
// MessageBox.Show("ffmpeg -i " + ultimo_file + " -target pal-dvd " + percorsoMPEG + zeri + numfiles2 + "_" + lbldataeora.Text + ".mpg");
listBox1.Items.Add("fine conversione");
});

errore:

Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'listBox1' da un thread diverso da quello da cui è stata eseguita la creazione.

21-5-73
05-05-2011, 12:11
edit

giangian2
05-05-2011, 12:58
Non puoi accedere ad oggetti dell'interfaccia grafica da un thread diverso da quello in cui sono stati creati.
La classe Task esegue il codice in un thread separato, quindi non puoi aggiungere un'item alla listbox... per fare cio devi usare il metodo BeginInvoke (http://msdn.microsoft.com/it-it/library/0b1bf3y3(v=vs.80).aspx)

ciao

millennio
05-05-2011, 13:33
Task.Factory.StartNew(() =>
{ listbox1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(delegate() { listbox1.Items.Add("Converto") });
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "ffmpeg";
proc.StartInfo.Arguments = " -i " + ultimo_file + " -target pal-dvd " + percorsoMPEG + zeri + numfiles2 + "_" + lbldataeora.Text + ".mpg";
proc.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; //nasconde la finestra dos
proc.Start();
proc.WaitForExit();
// MessageBox.Show("ffmpeg -i " + ultimo_file + " -target pal-dvd " + percorsoMPEG + zeri + numfiles2 + "_" + lbldataeora.Text + ".mpg");
listbox1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(delegate() { listbox1.Items.Add("Fine conversione") });
});


ci può stare?

millennio
05-05-2011, 14:17
Niente non ne esco fuori!

giangian2
05-05-2011, 15:44
Se non ci dici quali errori hai è difficile darti una mano ;)

Kralizek
05-05-2011, 16:12
leggiti questi 4 articoli di base sulla TPL. sono veramente facili da capire :)

http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx
http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers-and-synchronization-context.aspx
http://blogs.msdn.com/b/csharpfaq/archive/2010/07/19/parallel-programming-task-cancellation.aspx
http://blogs.msdn.com/b/csharpfaq/archive/2010/08/12/blocking-collection-and-the-producer-consumer-problem.aspx

millennio
06-05-2011, 07:44
Nessun errore, solo che non riesco a capire come scrivere nella listbox da un thread diverso!

Ho letto anche le 4 guide, ma non ci ho capito un granchè di roba!

Qualcuno cosi gentile da aiutarmi?


Thanks

millennio
06-05-2011, 08:11
A chi potesse interessare ho risolto con:

private delegate void AddListBoxItemDelegate(object item);

private void AddListBoxItem(object item)
{
if (this.listBox1.InvokeRequired)
{
// This is a worker thread so delegate the task.
this.listBox1.Invoke(new AddListBoxItemDelegate(this.AddListBoxItem), item);
}
else
{
// This is the UI thread so perform the task.
this.listBox1.Items.Add(item);
}
}

e dentro il nuovo thread aggiungo dati al listbox con:

AddListBoxItem("quellochevoglioscrivere");