Pause dans une appli [Résolu]

Signaler
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016
-
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016
-
Bonjour,

Mon application ouvre une vidéo et une Db qui contient des sous-titres et des délais d'affichage de chaque sous-titres en seconde pour assurer la synchronisation.
Sleep (1000 * rs.Fields("soustitre"))

Si l'utilisateur clique sur une commande pause, il faut attendre la fin de l'affichage du sous-titre pour que l'appli prenne en compte la pause, donc si la sous-titre est affiché 10 sec, la pause commence seulement après 10 sec.
Pour éviter ça, je fais:

For iSynchro = 1 To totSynchro
Sleep (iSynchro * rs.Fields("soustitre"))
DoEvents
Next iSynchro
Ceci permet de faire la pause immédiatement.

Contrairement à ce que j'attendais, totSynchro ne peut pas = 1000 mais à 43 ou 44. Je suppose que le temps d'exécution de la boucle y est pour quelque chose mais comment standardiser ce totSynchro étant donné que ce temps d'exécution doit dépendre du processeur de l'utilisateur et que je risque de perdre la synchro?

4 réponses

Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
146
Pourquoi ne pas utiliser une pause de 1ms(pour calmer le processeur) et un DoEvents (pour gérer les events) et utiliser comme synchronisation la variable globale Timer ou encore l'API TickCount ?
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016

En effet
Private Declare Function GetTickCount Lib "kernel32" () As Long

debut = GetTickCount()
While GetTickCount() - debut <= 1000 * rs.Fields("soustitre")
Sleep (1)
DoEvents
Wend
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Bonjour,
le bout de code que tu montres ne permet pas de t'aider.
C'est dans le code de visualisation (déroulement) de ta video que doit être utilisé le Doevents, de sorte à permettre l'interruption par le bouton pause.
Tu ne nous dis par ailleurs pas ce qu'est ce bouton pause ... Est-ce un bouton de commande placé par toi-même, ou autre (et alors précise-le) ?

En d'autre termes : comment (par quo et par quel codei, exactement) visualises-tu la vidéo et comment (par quoi et quel code) gères-tu le bouton pause ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Tout est en fait très différent selon que tu gères toi-même complètement (par ton propre outil et interface) l'outil de visualisation ou que tu insères dans ton appli un outil déjà fait.
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016

j'espère que ceci va éclairer, mais l'appli fait d'autres choses, difficile de mettre tout le code
L'utilisateur choisit une db et la vidéo correspondante est lancée
pas WMPlayer
  
conFor_Connect
rsEnt.Open "SELECT * FROM Entretien ;", cnxFor, adOpenDynamic, adLockOptimistic
rsEnt.MoveFirst
V I D E O
La vidéo corrrespondante de le db est ouverte, la première ligne de la db est lue, elle contient l'endroit du réel début du film

WindowsMediaPlayer1.settings.autoStart = False
WindowsMediaPlayer1.URL = Left(nameEnt, Len(nameEnt) - 7) & "VID.avi"
WindowsMediaPlayer1.Controls.play
debutFilm = rsEnt.Fields("soustitre")
WindowsMediaPlayer1.Controls.currentPosition = debutFilm
MsgBox WindowsMediaPlayer1.status
rsEnt.MoveNext
cette requete résume les sous-titres et différents paramètres
 reqStatCatGen = "TRANSFORM Count(Entretien.Texte) AS CompteDeTexte"
reqStatCatGen = reqStatCatGen & " SELECT Entretien.Enonce, Entretien.numEnonce, Entretien.loc"
reqStatCatGen = reqStatCatGen & " FROM Entretien"
reqStatCatGen = reqStatCatGen & " GROUP BY Entretien.Enonce, Entretien.numEnonce, Entretien.loc ORDER BY Entretien.numEnonce"
reqStatCatGen = reqStatCatGen & " PIVOT Entretien.CatGen;"
rsStatEnt.Open reqStatCatGen, cnxFor, adOpenKeyset, adLockPessimistic
rsStatEnt.MoveNext
totSynchro = 44
'on balaie la DB de synthèse où une ligne = un énoncé

Do While Not (rsStatEnt.EOF)
numEnonce = numEnonce + 1
toute une série de calcul/graphique sur rsStatEnt
'la synchro: le sous titre est affiché pendant le temps qui est dans rs.Fields("soustitre")

For iSynchro = 1 To totSynchro
Sleep (iSynchro * rsEnonce.Fields("soustitre"))
DoEvents
Next iSynchro
Les sous-titres déjà passés sont affichés dans un textbox
   
For iii = 1 To (numEnonce - 1)
sEnonce = Replace(rsStatEnt.Fields("Enonce"), "£s", "Soignant: "): sEnonce = Replace(sEnonce, "£p", "Patient: ")
sEnonce = Replace(sEnonce, "_" & Chr(12), " ?"): sEnonce = Replace(sEnonce, Chr(12), "")
txtOld = txtOld & vbCrLf & sEnonce: txtOld.SelStart = Len(txtOld.Text)
rsStatEnt.MoveNext
Next iii
Loop



'la pause est un bouton de commande

Private Sub cmdPause_Click()
Dim posPause As Integer
WindowsMediaPlayer1.Controls.pause
blPause = True: cmdPause.Visible = False: cmdGo.Visible = True
End Sub
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
Des bouts de code montrés sans dire dans quelles procédures évènementielles ils se trouvent est assez étrange.
Mais bon ...
Tu dois tout simplement pouvoir "jouer" avec la procédure cmdPause-Click
- y insérer ton attente (une boucle d'attente traditionnelle) puis relancer par
WindowsMediaPlayer1.Controls.Play
pour continuer
NB : tu aurais à ce propos intérêt à vérifier dans la foulée la disponibilité de la pause
(WindowsMediaPlayer1.Controls.isAvailable("Pause") devant renvoyer True)