French Pause, sleep, wait

Calvero

Member
Licensed User
Bonjour à tous,

J'ai besoin de créer une pause, j'ai épluché internet il y a une procédure avec un timer dans ce style :

B4X:
Sub Process_Globals
   Dim Timer1 as Timer
End Sub
Sub Activity_Create
   Timer1.Initialize("Timer1", 1000) ' 1000 = 1 second
   Timer1.Enabled = True
End Sub
Sub Timer1_Tick
   'Handle tick events
End Sub

Connsaissez-vous d'autres méthodes ? Ou pouvez-vous m'expliquer celle là ?

Merci d'avance de vos réponses.
 

Calvero

Member
Licensed User
En fait je suis entrain de faire un Quizz sous forme de QCM (ma 1ère app) et j'aimerais que quand la personne clique sur une des 4 propositions, la personne voit la couleur de la proposition pendant une durée donnée : VERT pour juste, ROUGE pour faux, j'aimerais faire une pause d'une seconde mettons pour que la personne ai le temps de voir si elle a juste ou non.

Merci en tout cas de votre aide.
 

Informatix

Expert
Licensed User
Longtime User
En fait je suis entrain de faire un Quizz sous forme de QCM (ma 1ère app) et j'aimerais que quand la personne clique sur une des 4 propositions, la personne voit la couleur de la proposition pendant une durée donnée : VERT pour juste, ROUGE pour faux, j'aimerais faire une pause d'une seconde mettons pour que la personne ai le temps de voir si elle a juste ou non.

Merci en tout cas de votre aide.
Dans ce cas, il faut effectivement utiliser un timer. Tu démarres ce timer avec Enabled = True. Toutes les secondes (ou autre durée spécifiée lors de l'initialisation), il va générer un évènement Tick. Dans cet évènement, tu peux stopper le timer (Enabled = False) et faire disparaître la couleur que tu avais affichée.
 

Calvero

Member
Licensed User
Désolé de ma nullité mais peux-tu m'envoyer un exemple de code expliqué. Pour l'instant j'ai ce code :

B4X:
Sub b_reponse1_Click
   p= p + 1
   If b_reponse1.Text = r5 Then
     score = score + 1
     b_reponse1.Color=Colors.Green
'C'est ici que je vous voudrais un timer 
     b_reponse1.Color=Colors.DarkGray
   End If
   b_reponse1.Color=Colors.Red
'Et là
   b_reponse1.Color=Colors.DarkGray
   CallSub("",loadq)
End Sub
 

Calvero

Member
Licensed User
En fait j'ai essayé de mettre celui que j'ai mis dans mon 1er post mais bon ne sachant pas comment l'appliquer ou du moins l'utiliser je n'ai pas réussi du coup je l'ai enlevé.

Mais je te rassure j'ai passé un bon moment à essayer, je cherche pas sur le forum à que les autres fassent à ma place ce que j'aurais pu faire.

Mais après peut être que mon approche n'est pas bonne. Je sais pas, ou du moins j'en doute pas.
 

Calvero

Member
Licensed User
J'ai réussi à faire fonctionner le timer, dans une procédure timer1_tick du coup j'appelle cette procédure avec la commande callsub(...) le problème c'est que ma procédure principale n'attends pas la fin du callsub pour s’exécuter.

B4X:
Sub b_reponse1_Click
    p= p + 1
    If b_reponse1.Text = r5 Then
        score = score + 1
        b_reponse1.Color=Colors.Green
        CallSub("",timer1_tick)      ' Appel de mon timer qui devrait temporiser mon programme mais ne le fais pas ....
        b_reponse1.Color=Colors.Gray
        Else
        b_reponse1.Color=Colors.Red
        b_reponse1.Color=Colors.Gray
    End If

    If nbqpassee = 10 Then
        Activity.RemoveAllViews
        Activity.LoadLayout("lay_main")
        Else
            CallSub("",loadq)
    End If
End Sub

Procédure du timer :

B4X:
Sub timer1_tick
   t = t + 1
   Log(t)
End Sub

Du coup je vois dans les logs la valeur t qui s'incrémente de 1 chaque seconde mais ça n'empêche pas l'execution de Sub b_reponse1_Click.

J'ai essayé ça mais ça n'a pas résolu pour autant :

B4X:
Sub timer1_tick
   t = t + 1
   Log(t)
timer1.Enabled = False
End Sub

Juste dans mes logs où le timer s'arrete mais Sub b_reponse1_Click s’exécute sans en tenir compte malgré tout.
 

lemonisdead

Well-Known Member
Licensed User
Longtime User
Bonsoir,
Il est inutile de faire un Callsub() vers Timer1_Tick. Par contre, utilisez Timer1.Enabled=True depuis votre Sub "b_reponse1_Click" afin de démarrer le Timer. Il fera Tick à l'issue du délai que vous avez paramétré (pensez effectivement à placer Timers1.Enabled=False dans Timer1_Tick pour l'arrêter).
Eventuellement, modifiez votre code pour ne pas démarrer le Timer dans Activity_Create où vous n'aurez qu'à l'initialiser.

b_reponse1_Click s’exécute sans en tenir compte malgré tout
C'est une question de design de votre application. Si vous voulez éviter l'exécution de b_reponse1_Click quand le Timer1.Enabled=True, vous pouvez placer un If Timer1.Enabled then Return en tant que première ligne de la Sub
 

klaus

Expert
Licensed User
Longtime User
Tu devrais essayer ceci:
B4X:
Sub b_reponse1_Click
    p= p + 1
    If b_reponse1.Text = r5 Then
        score = score + 1
        b_reponse1.Color=Colors.Green
    Else
        b_reponse1.Color=Colors.Red
    End If
    Timer1.Enabled = True     ' Appel de mon timer qui devrait temporiser mon programme mais ne le fais pas ....

    If nbqpassee = 10 Then
        Activity.RemoveAllViews
        Activity.LoadLayout("lay_main")
    Else
        CallSub("",loadq)
    End If
End Sub

Sub Timer1_Tick
    b_reponse1.Color=Colors.Gray
    Timer1.Enabled = False
End Sub
Il faut bien comprendre le fonctionnement des Timers.
Un Timer n'est pas une 'boucle d'attente' !
En premier il faut l'initialiser avec un intervalle temps, 1 seconde dans ton cas.
Dès que tu actives le Timer avec Timer1.Enabled = True la routine évènement Timer1_Tick est exécutée après chaque intervalle temps.
Dans ton cas comme tu veux qu'elle ne s'exécute qu'une seule fois tu dois desactiver le Timer dans Timer1_Tick avec Timer1.Enabled = False.
 
Last edited:

Calvero

Member
Licensed User
C'est pas faute d'avoir cherché mais ça marche : voilà le code final pour ceux à qui ça pourrait servir dans un cas analogue :

B4X:
Sub Activity_Create(FirstTime As Boolean)
Timer1.Initialize("Timer1", 1000) ' 1000 = 1 second
....
End Sub

B4X:
Sub timer1_tick
    b_reponse1.Color=Colors.RGB(0,128,128)
    Timer1.Enabled = False
        If nbqpassee = 10 Then
            CallSub("",restart)
        Else
            CallSub("",loadq)
    End If
End Sub

B4X:
Sub b_reponse1_Click
    p= p + 1
    If b_reponse1.Text = r5 Then
        score = score + 1
        b_reponse1.Color=Colors.Green
    Else
        b_reponse1.Color=Colors.Red
    End If
    Timer1.Enabled = True
End Sub

Je me suis appuyé principalement sur la réponse de Klaus mais j'ai aussi appris des commandes tel que le return donc l'échange a été très constructif pour moi.

Parfait merci beaucoup ça fonctionne ! Enfin, je suis débloqué grâce à vous 3 merci beaucoup !
 
Top