Synchronisation entre thread

chm69 Messages postés 3 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 7 mai 2009 - 10 avril 2009 à 11:50
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 - 10 avril 2009 à 16:29
Bonjour,

Je suis nouveau sur ce forum et je débute en C#.

J'aimerais lancer un scan d'une image et qu'une progressbar  le temps du scan.
J'ai trouvé pas mal de choses sur votre site, mais je n'obtient pas le résultat voulu.

Voilà, mon code:

private
Thread ScanThread;
// pour ProgressBar + Scan
bool termine =
false;

private
delegate
void
SyncDelegate();

private
void timerScan_Tick(
object sender,
EventArgs e)
{

// Création et démarrage du nouveau thread
ScanThread =
new
Thread(
new
ThreadStart(Scan));
ScanThread.Priority =
ThreadPriority.Normal;
ScanThread.IsBackground =
true;
ScanThread.Start();

progressBarWait.Value = 0;
progressBarWait.Visible =
true;
labelWait.Visible =
true;
labelWait.Refresh();
termine =
false;

for (
int i = progressBarWait.Minimum; i <= progressBarWait.Maximum; i++)
{

try
{
   progressBarWait.PerformStep();
   progressBarWait.Refresh();

   if (termine ==
true)
   {

      break;
   }
}

catch (
Exception)
{

throw;
}
}
progressBarWait.Visible =
false;
labelWait.Visible =
false;
labelWait.Refresh();
}

private
void Scan()
{
   
SyncDelegate Del =
new
SyncDelegate(Scan_Sync);
   progressBarWait.BeginInvoke(Del);
}

private
void Scan_Sync()
{
   ///// Scan de l'image
}

Mon scan marche très bien mais ma progressBar ne se remplie pas. Elle apparait bien en début et disparait à la fin.

Quelqu'un peut-il m'aider?
Merci

3 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
10 avril 2009 à 14:20
1 - tu nas absolument pas de second thread la. juste un timer
2 - si tu en avais un second, modifier la progressbar dans le tick du timer ferait exploser ton appli

Soit tu utilise Application.DoEvents() lorsque tu veux mettre à jour ta progress bar, soit tu utilise un System.Threading.Timer (et non pas un System.Windows.Forms.Timer), soit tu utilise un BackgroundWorker
0
chm69 Messages postés 3 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 7 mai 2009
10 avril 2009 à 15:51
Merci, mais je pensais que le rets de ma classe form était par naissance le thread principal.
Peux-tu me donner un exemple succint des 3 solutions que tu préconise.
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
10 avril 2009 à 16:29
ceci doit fonctionner :

public void StartScan()
{
    progressBarWait.Value = 0;
    progressBarWait.Visible =
true;
    labelWait.Visible =
true;

    timerScan.Interval = .......;

    timerScan.Start();

    ScanThread =
newThread(
newThreadStart(Scan));
    ScanThread.Priority =
ThreadPriority.Normal;
    ScanThread.IsBackground =
true;
    ScanThread.Start();

}

private
void timerScan_Tick(
object sender,
EventArgs e)
{

    progressBarWait.PerformStep();

}

private
voidScan()
{
    try{
        ///// Scan de l'image

   }
   finaly
   {
        SyncDelegate
Del =
newSyncDelegate(Scan_Sync);
        progressBarWait.BeginInvoke(Del);

    }
}

private
void OnScanEnd()
{
progressBarWait.Visible =
false;
labelWait.Visible =
false;

}
0
Rejoignez-nous