Pause dans une appli

Résolu
lacomm
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016
- 25 sept. 2014 à 10:29
lacomm
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016
- 25 sept. 2014 à 14:04
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

NHenry
Messages postés
14944
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2022
161
25 sept. 2014 à 10:36
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 ?
1
lacomm
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016

25 sept. 2014 à 14:04
En effet
Private Declare Function GetTickCount Lib "kernel32" () As Long

debut = GetTickCount()
While GetTickCount() - debut <= 1000 * rs.Fields("soustitre")
Sleep (1)
DoEvents
Wend
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 25/09/2014 à 11:08
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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
25 sept. 2014 à 11:31
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.
0
lacomm
Messages postés
11
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
27 janvier 2016

25 sept. 2014 à 11:38
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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
25 sept. 2014 à 11:53
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)


0