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 - Multithreading e Controlli C#
Forum - C# / VB.NET - Multithreading e Controlli C#

Avatar
NetProgrammer (Member)
Pro


Messaggi: 175
Iscritto: 28/06/2008

Segnala al moderatore
Postato alle 12:07
Giovedì, 21/08/2014
Buongiorno, Vi scrivo perchè non riesco a risolvere il seguente problema.
Sto scrivendo un'applicazione in C# che fa uso di threads. La struttura è la seguente:
Ho un Windows Form con un datagrid vuoto, dal thread del form avvio un thread secondario(uno o più) che ha il compito di aggiornare il datagrid.
Da quello che ho studiato ho capito che devo creare un delegato per permettere al thread di agire sul controllo del main thread in maniera sicura.
Ecco quello che ho fatto io:
Codice del delegato nel widows form
Codice sorgente - presumibilmente C#

  1. public delegate void updateGridHandler(DataTable dt);
  2.         public void updateGrid(DataTable dt)
  3.         {
  4.             if (this.dataGridView1.InvokeRequired)
  5.                 this.dataGridView1.Invoke(new updateGridHandler(updateGrid), dt);
  6.             else
  7.                 this.dataGridView1.DataSource = dt;
  8.         }


Il codice del thread risiede in una classe separata(GlobalItems) che richiamo in questa maniera dal form principale alla pressione di un bottone:
Codice sorgente - presumibilmente C# / VB.NET

  1. GlobalItems.t = new Thread(new ThreadStart(GlobalItems.tester));
  2.                 GlobalItems.t.Start();


Ora dal thread quando devo modificare il datagrid lo faccio in questa maniera:
Codice sorgente - presumibilmente C# / VB.NET

  1. if (...)
  2.                         {
  3.                             MainForm mf = new MainForm();
  4.                             mf.updateGrid(dt); //dt=datatable con i dati aggiunti dal thread
  5.                         }


Debuggando l'applicazione ho notato che InvokeRequired è sempre false e quindi il datagrid non viene aggiornato.
Non riesco a capire dove sbaglio.
In attesa di una Vostra gentile risposta,
distinti saluti.

Ultima modifica effettuata da NetProgrammer il 21/08/2014 alle 12:10
PM Quote
Avatar
vankraster (Member)
Rookie


Messaggi: 32
Iscritto: 05/11/2010

Segnala al moderatore
Postato alle 12:06
Venerdì, 12/09/2014
Io avrei risolto in un'altra maniera (Codice C#):
Nel Form1 fai:
Codice sorgente - presumibilmente C# / VB.NET

  1. public void updateGrid(){
  2. this.dataGridView1.DataSource = dt;
  3. this.dataGridView1.DataBind();
  4. }



Quando devi modificare la grid dal thread fai:

Codice sorgente - presumibilmente C# / VB.NET

  1. public delegate void InvokeDelegate();
  2.  
  3.  this.Form1.BeginInvoke(new InvokeDelegate(updateGrid));



In precedenza al thread gli devi passare il Form1 come parametro, quindi alla classe aggiungi una proprietà di tipo Form e prima di lanciare il thread fai classe.mf= Form1; Non va bene come fai tu "MainForm mf = new MainForm();" la Form1 dev'essere la stessa che tu hai creato in precedenza.
Adesso ti rimane passare il paramentro dt alla Form1, ma dovrebbe essere una cavolata

Ultima modifica effettuata da vankraster il 12/09/2014 alle 12:08


Ci possono togliere tutto tranne la ragione e con questa possiamo ricostruire l'universo.
PM Quote