Faire des boucles sur plusieurs progressbar

kuriozity Messages postés 3 Date d'inscription samedi 18 avril 2015 Statut Membre Dernière intervention 21 avril 2015 - 21 avril 2015 à 09:14
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 27 avril 2015 à 08:02
Bonjour, a tous et a toutes.

Alors voila, débutant sur vb, je suis en ce moment en train de dev un petit jeux .

Le jeux est hyper simple en sois, click droit pour ordonner une tache a un personnage un click gauche pour ouvrir un menu. pas d'animations etc...


le but en somme c'est que le joueur recupere de l'argent, il le recupere quand la valeur atteint 100%, celle-ci activée avec un bouton


Donc créer une progress bar avec un timer OK ça marche
... mais la boucle ne marche pas (je n'y arrive pas XD)

créer une Progressbar avec Application.DoEvents() et System.Threading.Thread.Sleep(50) ok ca marche
.... mais il me semble que l'on ne peut utiliser plusieurs fois application.doevents car il ordonne a un contrôle de faire une action gèle l'appli tant qu'elle n'est pas finie.

Le soucis c'est que : le joueur ordonne une action a un personnage -> la progressbar défile, arrive a la fin. Un label reçois +1 dans son texte.

Mais je voudrais que si le texte du label >=10 (par exemple)
l'action ce fait automatiquement, en déverrouille une autre, que si le texte du label parenté a cette progressbar >=100 (encore a titre d'exemple) recommence a ce faire automatiquement.


en somme que plusieurs progressbar passent de 0 à 100 toutes seuls automatiquement avec un certain laps de temps

Bref je suis dans le caca, car si un truck marche l'autre ne marche pas.
j'ai entendu parler des threads mais sa ma l'air d'être une vraie usine a gaz.

En somme avec le doevents, j'arrive a faire ce que je veux SAUF, qu'il s'associe au programme donc, il attend que la première progressbar sois au max pour pour la deuxième fasse son taf ... arrrfff
Si quelqu'un peut éclairer ma petite lanterne je lui serait reconnaissant :°).

++ tout le monde

5 réponses

Nicolas H. Messages postés 36 Date d'inscription vendredi 19 octobre 2001 Statut Membre Dernière intervention 26 mai 2016 1
25 avril 2015 à 16:02
Bonjour,

J'ai eu le même type de problème, il y a moment.
http://codes-sources.commentcamarche.net/forum/affich-1537216-probleme-doevents

Aujourd'hui j'utilise beaucoup de cross thread.

exemple :


    Private Sub frmLoad_Load(sender As Object, e As EventArgs) Handles Me.Load

        ...

        pgbLoadProgress.Maximum = 35 : pgbLoadProgress.Value = 0

        Dim tThread As New Thread(Sub()
                                      LoadTest()
                                  End Sub)
        tThread.IsBackground = True
        tThread.Start()

    End Sub

    Private Sub LoadTest()

        Dim AppPath As String = Mid(IO.Path.GetFullPath(Application.ExecutablePath), 1, Len(IO.Path.GetFullPath(Application.ExecutablePath)) - Len(IO.Path.GetFileName(Application.ExecutablePath)))

        Test_...(AppPath)

        Test_...()

        BeginInvoke(New MyDelegate_LoadDVD(AddressOf LoadDVD))

    End Sub

    Private Delegate Sub MyDelegate_LoadDVD()

    Private Sub LoadDVD()

        Me.Hide() : frmDVD.Show()

    End Sub



    Private Sub Test_...(ByVal AppPath As String)

        BeginInvoke(New MyDelegate_UpdateLabelTestFile(AddressOf UpdateLabelTestFile), "DVDKit.dll")

        ...

        BeginInvoke(New MyDelegate_UpdateLoadProgress(AddressOf UpdateLoadProgress))

    End Sub

    Private Delegate Sub MyDelegate_UpdateLabelTestFile(ByVal sText As String)

    Private Sub UpdateLabelTestFile(ByVal sText As String)

        lbTestFile.Text = sText

    End Sub

    Private Delegate Sub MyDelegate_UpdateLoadProgress()

    Private Sub UpdateLoadProgress()

        pgbLoadProgress.Value += 1

    End Sub

    Private Sub Test_...()

        BeginInvoke(New MyDelegate_UpdateLabelTestFile(AddressOf UpdateLabelTestFile), "Sun JavaVM")

        ...
        BeginInvoke(New MyDelegate_UpdateLoadProgress(AddressOf UpdateLoadProgress))

    End Sub




Comme ceci tout tourne en arrière plan et les éléments se mettent à jour. Pas de freez ou autre. Pour certaine fonction, je passe aussi par un timer qui attend la fin du job (cf. : mon problème).


Bonne soirée,
Nicolas H.

--
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
25 avril 2015 à 20:59
Bonsoir,

quel version de VB?
VBA? VB6, VBS, VB.Net?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 avril 2015 à 16:21
Bonjour,
La question fondamentale me semble être la raison pour laquelle il y a plusieurs progressbar, puisque seule une est active à un instant t.
Il suffirait d'utiliser un (seul) timer, dans le code duquel :
- on remet à 0 cette unique progressbar dès la limite atteinte
- on traite l'objet suivant, les objets étant préalablement déclarés dans une liste à traiter.

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 27/04/2015 à 06:48
On ne sait même pas sous quelle version de Visual Basic tu développes (tu es ici dans le forum GENERAL de VB) !
Regarde ce que ferait ceci sur VB6 (avec 3 labels, un bouton de commande et un timer)
Private Sub Command1_Click()
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Static toto, tata, i As Integer, combien As Integer
toto = Array("Label1", "Label2", "Label3") ' tes labels
tata = Array(10, 7, 9) ' la durée pour chacun d'entre eux
combien = combien + 1
Controls(toto(i)).Caption = combien
If combien = tata(i) Then
i = i + 1
combien = 0
End If
If i > UBound(toto) Then Timer1.Enabled = False
End Sub

Cela devrait te donner quelques idées. Ajoute, si tu le veux, l'unique progressbar nécessaire.
Je doute fort que ce ne soit pas le même principe sous VB.Net, si tu développes sous VB.Net

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 27/04/2015 à 08:09
Tiens,
écrit encore autrement
J'ai ajouté une progressbar (une seule)
La couleur des labels change lorsque le délai est passé ===>>
sous VB6 ===>>
Private toto, tata

Private Sub Command1_Click()
Timer1.Interval = 1000
Timer1.Enabled = True
toto = Array(Label1, Label2, Label3)
tata = Array(12, 21, 18)
For i = 0 To UBound(toto)
toto(i).Caption = ""
toto(i).BackColor = vbWhite
toto(i).ForeColor = vbBlack
Next
End Sub

Private Sub Timer1_Timer()
Static i As Integer, combien As Integer
ProgressBar1.Min = 0
ProgressBar1.Max = tata(i)
combien = combien + 1
ProgressBar1.Value = combien
toto(i).Caption = combien
If combien = tata(i) Then
toto(i).Caption = combien
toto(i).BackColor = vbRed
toto(i).ForeColor = vbWhite
i = i + 1
combien = 0
End If
If i > UBound(toto) Then Timer1.Enabled = False
End Sub


Si tu développes sous VB.Net, ce n,e devrait pas être vraiment différent !

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Rejoignez-nous