Plusieurs procédures : programme non fluide

cs_Finality Messages postés 76 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 22 janvier 2009 - 15 déc. 2007 à 10:44
Le newbie Messages postés 200 Date d'inscription mardi 17 octobre 2006 Statut Membre Dernière intervention 24 mars 2012 - 17 déc. 2007 à 12:52
Bonjour tout le monde,


Je suis actuellement en train de développer un casse brique. Pour le
faire fonctionner, j'utilise 2 timers : un pour gérer le mouvement de
la balle et un pour le mouvement des bonus. De plus, j'utilise un
MouseMove pour déplacer la raquette à la souris :

picRaquette.Left = e.X + (picRaquette.Width/2)

Mon probleme est que quand je bouge la souris, la
balle s'arrete de bouger, et que quand le timer pour les bonus
s'enclenche, la balle se met à "ramer". Mon prof d'informatique m'a dit
que cela provenait du fait que VB ne pouvait gérer qu'une procédure à
la fois. Est-ce bien ça? Si oui comment puis-je faire pour résoudre ce
probleme?


Je vous remercie pour votre réponse et votre aide

Cordialement

Kevin PERRIAT

13 réponses

nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
15 déc. 2007 à 10:54
ta essayé de séparer ton programme en THREAD

 Sivous avezbesoin
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
15 déc. 2007 à 10:55
Salut,

Je ne sais pas si cela peut t'aider, mais dans tes procédures qui aaparement "tourne" très souvent, essaye de mettre un DoEvents dans celles-ci...Cela permet de rendre la main au système quelques milli-secondes et ainsi permettre au système de traiter d'autres opérations...

Si pas de DoEvents en .net, il y a peut-être un équivalent..
A+
Exploreur

 Linux a un noyau, Windows un pépin

 
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
15 déc. 2007 à 11:00
Si tu es en VB6, tu ne vas malheureusement pas avoir beaucoup de solutions.

Par contre si tu es en VB2005 comme l'indique la rubrique ou tu as posté, tu peux utiliser le mécanisme de Threads.
Par défaut ton programme fonctionne dans un thread qui est allouer au processus. Mais tu peux creer d'autres threads pour certaines parties de ton code qui peuvent fonctionnées indépendamment et en parallèle du reste du programme.
Ainsi tu pourrais avoir le thread principal du programme plus un thread pour le timer de la balle et un autre pour les bonus.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
15 déc. 2007 à 11:00
Arf, pas assez rapide ce matin

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0

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

Posez votre question
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
15 déc. 2007 à 11:09
C'est pas grave cassy tu iras plus vite la prochaine fois, j'en suis sûr !!!

 
0
cs_Finality Messages postés 76 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 22 janvier 2009
15 déc. 2007 à 11:35
tout d'abord merci à vous tous pour votre aide (j'espere pouvoir arriver un jour à ce que ce soit moi qui vous aide )

Donc à ce que s'en dégache, je dois utiliser les threads. (oui je suis en VB 2005) Le probleme c'est que je ne connais pas du tout les threads. Auriez vous un lien pour un tuto ou alors pourriez vous m'expliquez comment cela fonctionne?

Je vais essayer d'uploader mon programme pour que vous puissez voir le code

Encore merci à vous
Cordialement
Kevin PERRIAT
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
15 déc. 2007 à 13:47
n'oublie pas que google est l'ami des programmeurs, fais une petite recherche "vb2005, thread"

 
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
15 déc. 2007 à 13:51
pour ce qui est de nous aider ne t'en fait pas(regarde l'age que j'ai, il n'y a pas si longtemps que ça je me disais que je ne pourais jamais aider personne et depuis j'ai iadé un nombre considérable de personne) Tout ça pour te dire que je suis sûr qu'un jour tu saura nous aider et puis LE FORUM CODE SOURCE EST LA POUR NOUS AIDER, IL EST LA POUR CA !!!
0
cs_Finality Messages postés 76 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 22 janvier 2009
15 déc. 2007 à 17:57
tout d'abord merci pour ta reponse

J'ai fait une recherche approfondie sur Google et j'ai trouvé ce tuto : http://support.microsoft.com/kb/315577/fr

J'ai bien suivi toutes les instructions et voilà le code que j'obtiens :

Imports System.Threading
Public Class Form1
    Private trd As Thread

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles Button1.Click
        MessageBox.Show("This is the main thread")
    End Sub

    Private Sub ThreadTask()
        Dim stp As Integer
        Dim newval As Integer
        Dim rnd As New Random()

        Do
            stp = ProgressBar1.Step * rnd.Next(-1, 2)
            newval = ProgressBar1.Value + stp
            If newval > ProgressBar1.Maximum Then
                newval = ProgressBar1.Maximum
            ElseIf newval < ProgressBar1.Minimum Then
                newval = ProgressBar1.Minimum
            End If

            ProgressBar1.Value = newval

            Thread.Sleep(100)
        Loop
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles MyBase.Load
        trd = New Thread(AddressOf ThreadTask)
        trd.IsBackground = True
        trd.Start()
    End Sub
End Class, ----
(Coloration syntaxique automatique par Kenji)

Le probleme c'est que quand je lance l'application, j'obtiens cette erreur :

Comment puis-je résoudre cette erreur et d'où vient-elle?

Je vous remercie pour votre réponse
Cordialement
Kevin PERRIAT
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
15 déc. 2007 à 18:51
c'est marqué que l'erreur viens du fait que le contrôle progressbar1 a été appelé a partir d'un thread autre que celui sur lequel il a été créé !!!
0
cs_Finality Messages postés 76 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 22 janvier 2009
15 déc. 2007 à 19:11
oui ça j'ai compris lol mais comment je change le thread sur lequel il a été créé?

Merci pour ton aide
Cordialement
Kevin PERRIAT
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
15 déc. 2007 à 20:21
ça par contre je ne sais pas !!!

 
0
Le newbie Messages postés 200 Date d'inscription mardi 17 octobre 2006 Statut Membre Dernière intervention 24 mars 2012 2
17 déc. 2007 à 12:52
Salut Finality, ton erreur vient du fait que tu veux gérer les objets de ta form (ici la progressbar) depuis ton thread. Un thread est comme un process si tu veux. Il est lancer par ton appli pour te permettre de faire du travail en tâche de fond. C'est comme si tu avais donc deux processus :  un pour ton affichage graphique et un pour le travail de fond.

Voilà pour l'explication générale. Je ne connais pas de moyens pour faire communiquer les thread entre eux (regarde mon pseudo !!!) comme tu veux le faire mais si quelqu'un le sait, je serais intéréssé.

En tout cas accroche toi bien fort car ça doit pas être simple la communication inter thread. Bon courage.

@+.
0
Rejoignez-nous