Saluto a tutti e problema con i thread c#

giovedì 24 aprile 2008 - 08.42

jarod Profilo | Newbie

Prima di esporre il mio problema faccio un saluto generale a tutti.

Detto questo vi espongo il mio problema.
Allora mi sono messo a smanettare con i thread e che ho pensato di fare? Ho fatto una semplice applicaizone in cui nel form principale ci sta una progressbar ed un bottone per l'avvio del thread che riempa sta progressbar; poi mi sono creato una classe che conteneva la funzione da gestire con thread in particolare non faceva altro che incrementare il valore della progressbar, fin qui teoricamente nessun problema ho fatto tutto, il thread lo gestisce benisismo ma la progressbar non da indicazione di scorrimento, mi spiego meglio, il valore si incrementa ma la progressbar non visualizza niente:

per chiarezza posto il codice sia del form principale sia della classe:
La prima è la classe qui ci stanno la funzione che devo mettere in thread (funzione read)

Codice:

using System; using System.Windows.Forms; namespace threadProgBar { /// <summary> /// Description of ClassFuncThread. /// </summary> public class ClassFuncThread { public ClassFuncThread() { } #region Variabili e oggetti threadProgBar.MainForm objMF = new MainForm(); volatile bool var_continue=false; private int i=0; #endregion public void set_var_continue() { var_continue=true; } public int get_valuePocBar() { return i; } public void Read() { while(!var_continue) { //progress bar in avanti objMF.set_ProgressBar_MinMax(0,10000000); objMF.set_ProgressBar_Value(i); i++; if(objMF.get_ProcessBarValue()==10000000) var_continue=true; } MessageBox.Show("OK");//mi serviva come semplice prova di uscita dal while } } }
ora posto il codice mainform, visivamente si vede il bottone e la progressbar ora come dicevo sopra il thread va liscio ma non mi incrementa il valore visuale della progress bar io ho pensato che è dovuto al fatto che creando un nuovo oggetto(objMF) nella classe ClassFuncThread, questo non è collegato alla progressbar nel MainForm
Codice:

using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Threading; namespace threadProgBar { /// <summary> /// Description of MainForm. /// </summary> public partial class MainForm : Form { public MainForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // // TODO: Add constructor code after the InitializeComponent() call. // } #region Funzioni set / get public int get_ProcessBarValue() { return progressBar.Value; } public void set_ProgressBar_Value(int i) { progressBar.Value=i; } public void set_ProgressBar_MinMax(int min, int max) { progressBar.Minimum=min; progressBar.Maximum=max; } #endregion void Btn_AvviaThreadClick(object sender, EventArgs e) { threadProgBar.ClassFuncThread objCFTH = new ClassFuncThread(); Thread objThread = new Thread(objCFTH.Read); objThread.Start(); while(!objThread.IsAlive); progressBar.Value=objCFTH.get_valuePocBar(); Thread.Sleep(10); // objCFTH.set_var_continue(); } } }
In attesa anche di un piccolo suggerimento vi ringrazio in anticipo

rossimarko Profilo | Guru

Ciao,

stai utilizzando il framework 2.0?

Se si ti consiglio ti consiglio di utilizzare il controllo BackgroundWorker che è stato creato apposta per l'esecuzione di processi in background (su un thread separato): http://msdn2.microsoft.com/it-it/library/8xs8549b.aspx

Questo controllo gestisce già le varie problematiche di accesso ai controlli della form da parte del thread secondario.


-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5