2010-05-18 8 views
0

Je travaille avec C# .net, application Windows, je voudrais utiliser o Progressbar en CLICK sans BackgroundWorker, peut-on suggérer, merci à l'avance ....... ............., j'ai essayé d'utiliser du fil, la boucle For itération,Comment utiliser Progressbar en CLICK sans BackgroundWorker

+0

Pouvez-vous élaborer plus de wat exactement que vous voulez atteindre.? Par le détail donné je reçois que vous voulez montrer la barre de progression sur un clic d'un bouton suis-je raison !!! – Malcolm

Répondre

2

La réponse rapide est assez proche de « vous ne pouvez pas ».

La réponse plus longue est:

Théoriquement vous pouvez simplement commencer une barre de progression, puis le mettre à jour dans une boucle for().

Cependant, cela ne fonctionne pas très bien en pratique. La raison en est que pendant que vous êtes dans votre boucle, votre application est "occupée" et elle ne répond pas aux messages Windows venant du système d'exploitation. Le système d'exploitation remarquera cela et décidera que vous ne répondez pas, il prend donc un instantané de votre fenêtre. À partir de ce moment, chaque fois que vous mettez à jour votre barre de progression, le système d'exploitation affiche simplement l'instantané au lieu de l'état actuel, donc la barre de progression est déplacée à (par exemple) 35% . Cela bat complètement le point d'avoir une barre de progression!

Pour résoudre ce problème, votre thread d'interface utilisateur doit conserver les messages de traitement. Il y a deux façons de le faire.

1) l'utilisation d'un fil séparé pour le poste de traitement, et demander le thread d'interface pour mettre à jour la barre de progression. C'est l'approche «Background Worker», et ça marche bien.

2) Vous pouvez appeler Application.DoEvents() à partir de votre boucle fixe pour(). Cela permet d'envoyer des messages pendant que vous êtes "occupé" et évite ainsi le problème. Cependant, cela est extrêmement dangereux car le traitement des messages peut provoquer des appels entrants à votre code (par exemple, si vous cliquez sur un bouton "go" pour commencer le traitement, l'utilisateur pourra cliquer à nouveau sur "go" et vous essaierez un traitement à l'intérieur de votre traitement). Pour résoudre ce problème, vous devez être très prudent en installant un MessageFilter pour vous assurer que vous ne traitez que des messages "sûrs" dans ce contexte. N'essayez pas cette approche à moins que vous ne sachiez vraiment ce que vous faites.

Alors que vous laisse avec une seule approche pratique: Utiliser un BackgroundWorker (ou votre propre fil). Il y a beaucoup de tutoriels sur la façon de faire cela sur le web, donc je ne vais pas développer cette approche ici.

Questions connexes