Delay et rafraîchissement interface utilisateur
Publié : lun. 06/avr./2020 12:34
Bonjour,
Je me demande à quel moment l'UI est rafraîchie : avec le code suivant, lorsque "WindowEvent" précède "SetGadgetText", le rafraîchissement se fait avec un compte de retard (visible uniquement en mode Débogueur, le mode "Run" n'ayant pas de référence temporelle). Ce serait donc "WindowEvent" qui permet ce rafraîchissement et il suffit d'intervertir les deux instructions pour résoudre le problème.On remarque d'ailleurs que le StringGadget et son contenu ne sont visibles qu'au bout de 10 secondes (avec Débogueur, et environ 3 secondes sans) lorsque le compteur est déjà à 21 (ou 6 sans Débogueur). Et ce n'est même pas une question de temps car passer le Delay de 500 à 1000 ne change pas la première valeur affichée (21 ou 6) !
Existe-t-il une instruction qui rafraîchit l'UI sans consommer d'événement ? Et que faire pour que mon compteur ne démarre que lorsque mon StringGadget est opérationnel ?
Le but final est de recevoir des Strings RS232 et de les retourner avec un délai pour simuler le fonctionnement d'un appareil réel. Comme il semble que le port série ne sait pas déclencher d’événements (sinon, votre solution m'intéresse), j'utilise donc "If AvailableSerialPortInput(Com)" dans la boucle principale avec "Event = WaitWindowEvent(100)". Ça fonctionne mais l'affichage est retardé pour les raisons exposées dans l’exemple ci-dessus et là, je ne peux pas intervertir ni ajouter de "WindowEvent" sans consommer d'événement.
Un plan B serait d'utiliser un Timer (et des drapeaux anti-recouvrement "aEchoPending") mais j'aimerais aussi et avant tout résoudre ce problème d'UI.
Merci d'avance pour vos suggestions...
Je me demande à quel moment l'UI est rafraîchie : avec le code suivant, lorsque "WindowEvent" précède "SetGadgetText", le rafraîchissement se fait avec un compte de retard (visible uniquement en mode Débogueur, le mode "Run" n'ayant pas de référence temporelle). Ce serait donc "WindowEvent" qui permet ce rafraîchissement et il suffit d'intervertir les deux instructions pour résoudre le problème.
Code : Tout sélectionner
; FileName "Delay&Display.pb"
EnableExplicit
Enumeration
#Gadget_Display
EndEnumeration
Define Event, aCounter.a
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 260, "PureBasic Window", #PB_Window_SystemMenu)
StringGadget(#Gadget_Display, 10, 10, 310, 20, "")
Repeat
Event = WindowEvent()
SetGadgetText(#Gadget_Display, "Text " + aCounter)
Debug "New Value : " + aCounter ; <------ Référence temporelle en mode Débogueur
Delay(500)
Debug "After Delay"
aCounter = aCounter + 1
Until Event = #PB_Event_CloseWindow
EndIf
End ; All the opened windows are closed automatically by PureBasic
Existe-t-il une instruction qui rafraîchit l'UI sans consommer d'événement ? Et que faire pour que mon compteur ne démarre que lorsque mon StringGadget est opérationnel ?
Le but final est de recevoir des Strings RS232 et de les retourner avec un délai pour simuler le fonctionnement d'un appareil réel. Comme il semble que le port série ne sait pas déclencher d’événements (sinon, votre solution m'intéresse), j'utilise donc "If AvailableSerialPortInput(Com)" dans la boucle principale avec "Event = WaitWindowEvent(100)". Ça fonctionne mais l'affichage est retardé pour les raisons exposées dans l’exemple ci-dessus et là, je ne peux pas intervertir ni ajouter de "WindowEvent" sans consommer d'événement.
Un plan B serait d'utiliser un Timer (et des drapeaux anti-recouvrement "aEchoPending") mais j'aimerais aussi et avant tout résoudre ce problème d'UI.
Merci d'avance pour vos suggestions...