Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Placement du DoEvents

20 réponses
Avatar
LE TROLL
Bonjour,

Quelqu'un peut-il me dire avec certitude, où
se met le DoEvents, par rapport à une action
bloquante, avant, après, les deux ???

DoEvents
bloc 1 certain temps...

OU

bloc 1 certain temps...
DoEvents

OU

DoEvents
bloc 1 certain temps...
DoEvents

???

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------

10 réponses

1 2
Avatar
LE TROLL
Merci Jean-Marc,

Bon, alors pour le DoEvens, au moins je sais,
ainsi il envoie juste un accès puis redonne
définitivement la main au code en séquence... ok,
donc, en effet, je vais les enlever...
Toutefois, rien dans les docs, ne dit que le
DoEvens n'agit pas comme un test permanent, par
exemple, pour 100 de temps imparti au programme,
il en donne en "boucle", 99 au son et 1 au clavier
et à la souris... de là ma question...

J'ai fait un truc de ce genre, en plus court:
j'ai pris une variable public, et à chaque jeu de
son synchronisé, je donne une valeur à la
variable, puis je l'enlève à la fin, de facto, si
on tente un accès périphérique (mouse, clv), ben,
je rejette (key=0: exit sub), tant que la variable
dit qu'un son est joué, y compris pour le End
(cancel=-1)...

Tu dis une solution "crade", ben non, dans la
mesure où rien n'est prévu, et qu'il faut
néanmoins résoudre un problème, tous les coups
sont permis :o)

Mais tout ça ne résout pas le problème de "ce
programme ne répond plus" (bidon), car il parle
pendant ce temps. Faut alors que je fasse des sons
plus courts pour lui redonner la main, je vais m'y
employer.

L'idéal serait de pouvoir bloquer le focus du
programme, qu'il reste actif, mais je ne sais pas
interrompre son espèce de timer qui affiche le
message de non réponse et la perte du focus, au
bout d'un temps qu'il impose, si tu sais ???

Pour le temps de jeu, je pense que ce ne doit
pas être un problème, car, étant de même type
(wav), il devrait suffire de diviser la taille par
le temps au 100ko par exemple, afin d'étalonner
grossièrement...

Je ne peux pas utiliser de désynchronisé,
(sauf exception très encadrée), car le code
continu, et, c'est le cas de le dire, le code
n'est plus en phase avec ce que raconte le son...

Au début, et on m'a répondu, j'avais laissé le
son synchronisé et la main (clv, mouse), ça
marchait bien, mais ensuite, je me suis aperçu que
les fichiers son (paroles en fait), qui était
interrompus, quand ils en avaient l'occasion,
dévidaient tout ce qu'il n'avait pu dire avant, hé
hé... On m'a bien indiqué comment vider la
mémoire, mais ça ne semble pas bien fonctionner
dans mon cadre, et je n'arrête pas, presque, de
lancer des fichiers son par API.
VB semble très peu enclin a bien générer du code
"sonorisée", c'est pas de la programmation, c'est
du combat !

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jean-marc"
a écrit
dans le message de news:
47a4ed3e$0$2953$
| LE TROLL wrote:
| > Ni avant, ni après, ni les deux, certes,
c'est
| > éloquent, mais c'est quoi la quatrième
solution
| > ???
|
| La réponse est effectivement :
| NI AVANT, NI après, NI les deux.
|
| La réponse est : PENDANT.
|
| Or dans ton cas (jouer un son etc.) tu ne peux
| pas utiliser le PENDANT.
|
| C'est bien pour ça que DoEvents ne résoudra rien
| dans ton cas.
|
| Doevents n'est pas magique : il donne la main au
système,
| puis l'exécution reprend son cours. Si a ce
moment on lance
| un traitement initerruptible et long, le
Doevents ne fait plus
| rien: il s'est exécuté, et c'est tout.
|
| Dans ton cas, mettre des DoEvents est tout
simplement inutile,
| que se soit avant ou après.
|
| La solution est bien sur prévue : jouer les sons
| en mode Asynchrone. Mais alors ils ne sont pas
interruptibles
| (et de surcroit désynchronisés, du coup ...).
|
| Il n'y a pas de solutions simples à ton
problème.
|
| Les seules envisageables (dans ton cas) :
| - des sons courts (en synchrone)
| - des longs, mais alors asynchrones.
|
| Si tu tiens absolument à faire des longs, tu
peux faire une bidouille
| bien crade mais qui fonctionnera :
|
| Imaginons une feuille avec 2 boutons de
commande.
| Quand on appuie sur Command1, ca joue un son
long.
| Pendant ce temps, tu ne veux pas bloquer le
programme
| (donc le son est lancé en asynchrone), MAIS tu
ne veux pas
| que l'on puisse appuyer sur Command2 (en fait
qu'il soit
| grisé).
|
| La solution va consister à bloquer Command2
pendant toute la
| durée nécessaire à jouer le son.
| On va supposer que tu connais le temps (disons 5
secondes).
|
| Dans command1, avant de lancer le son, il suffit
de mettre
| Enbaled de COmmand2 à Faux, puis de lancer un
Timer initialisé à 5
| secondes.
| Quand le timer se déclenchera, on remet Command2
Enabled, et on désactive
| le timer. Et le tour est joué.
|
| Voici un code complet, il faut une feuille, 2
boutons de commande
| et un timer :
|
|
|
| Option Explicit
| Private Const SND_ASYNC = &H1 'Joue le son en
arrière-plan.
| Private Const SND_FILENAME = &H20000 'Le son
provient d'un fichier externe
|
| Private Declare Function PlaySound Lib
"winmm.dll" Alias "PlaySoundA" (ByVal
| lpszName As String, ByVal hModule As Long, ByVal
dwFlags As Long) As Long
|
|
| Private Sub Command1_Click()
|
| Dim fileSound As String
| Dim tempo As Long
|
| ' parametres pour ce son en particulier
| tempo = 5000 ' 5 secondes
| fileSound =
"c:windowsmediawindaVinciSysStart.wav"
|
| ' désactive les controles voulus
| Command1.Enabled = False
| Command2.Enabled = False
|
| ' Init et Démarre le timer
| Timer1.Interval = tempo
| Timer1.Enabled = True
|
| ' lance le son en asynchrone
| PlaySound fileSound, ByVal 0&, SND_FILENAME
Or SND_ASYNC
|
| End Sub
|
| Private Sub Timer1_Timer()
|
| ' Désactive le timer
| Timer1.Enabled = False
|
| ' Autorise à nouveau les boutons
| Command1.Enabled = True
| Command2.Enabled = True
| End Sub
|
|
| C'est bien sur assez immonde, mais en codant le
tout proprement
| avec une fonction centralisée pour jouer les
sons, en stockant
| tout ça dans un joli tableau de structures avec
les noms des
| sons, le fichier qui va avec et la durée
d'attente, tu dois
| pouvoir faire un truc pas trop illisible.
|
| --
| Jean-marc Noury (jean_marc_n2)
| Microsoft MVP - Visual Basic
| FAQ VB: http://faq.vb.free.fr/
| mailto: remove '_no_spam_' ;

|
|
|
|
Avatar
parci
On Sat, 2 Feb 2008 23:22:54 +0100, "Jean-marc"
wrote:

La réponse est : PENDANT.



Pendant, c'était le mot que je cherchais ...

/.../

La solution est bien sur prévue : jouer les sons
en mode Asynchrone. Mais alors ils ne sont pas interruptibles
(et de surcroit désynchronisés, du coup ...).



Ben si, ils sont bien interruptibles avec :

PlaySound vbNullString, ByVal 0&, 0

Et de toute façon, si un son est en train d'être joué et que tu veux
en jouer un autre, le premier est interrompu. Donc en asynchrone, je
ne vois pas quel est le problème du Troll.
Avatar
Jean-marc
parci wrote:
On Sat, 2 Feb 2008 23:22:54 +0100, "Jean-marc"
wrote:

La réponse est : PENDANT.



Pendant, c'était le mot que je cherchais ...

/.../

La solution est bien sur prévue : jouer les sons
en mode Asynchrone. Mais alors ils ne sont pas interruptibles
(et de surcroit désynchronisés, du coup ...).



Ben si, ils sont bien interruptibles avec :

PlaySound vbNullString, ByVal 0&, 0




Bien sur. Ca a même déjà été dit.


Et de toute façon, si un son est en train d'être joué et que tu veux
en jouer un autre, le premier est interrompu. Donc en asynchrone, je
ne vois pas quel est le problème du Troll.



En réalité, moi non plus. Il n'y a pas de problème technique.
Mais je peux voir le problème sous-jacent, qui est ici très clairement
un problème de design auquel aucune solution ne peut être
apportée sur un newsgroup comme celui-ci...

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
LE TROLL
Bonjour cher Parci (moni)

Le problème, est:
Qu'un son A de 15s, joué 10s (on lui doit 5s) et
coupé par:

PlaySound vbNullString, ByVal 0&, 0...
+
un son B de 10s, par exemple.
------------
A la prochaine occasion où est appelé le son A, il
va faire:
son A en totalité (normal, 15s) + FIN du son A
d'avant, de 5s qui a été coupé...
------------
Ou encore, si tu coupes le son A une seconde fois
à 5s (manque 10)
A la prochaine occasion où est appelé le son A, il
va faire:
son A + son A de 5 der secondes + son A de 10 der
secondes.

A part si je m'y suis mal pris, quand un son est
interrompu, dès qu'il est rappelé, il joue le
reste, ok, et ainsi à chaque fois, sauf le moment
où il ne sera pas interrompu, la, il va se jouer,
plus jouer tout ce qu'il n'a pas pu jouer pour
raison d'interruption précédemment.

Un exemple pratique, en fait, c'est une belote
pour aveugle:
Le son énonce mon jeu Sud, supposons:
pique: as; 10; roi
A "10" Sud joue son "10", et donc coupe le son,
qui n'a pas pu dire "roi"...
tour suivant, je n'ai plus que:
pique: as + roi
Le son va lire ce qu'il y a : pique: As, Roi
Et va rajouter "Roi", q'il n'avait pas pu dire
pour coupure, soit As, Roi, Roi...

Je vais tenter de t'en faire la démonstration par
une petite application, si j'ai le temps...

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"parci" a écrit dans le message
de news:

| On Sat, 2 Feb 2008 23:22:54 +0100, "Jean-marc"
| wrote:
|
| >La réponse est : PENDANT.
|
| Pendant, c'était le mot que je cherchais ...
|
| /.../
|
| >La solution est bien sur prévue : jouer les
sons
| >en mode Asynchrone. Mais alors ils ne sont pas
interruptibles
| >(et de surcroit désynchronisés, du coup ...).
|
| Ben si, ils sont bien interruptibles avec :
|
| PlaySound vbNullString, ByVal 0&, 0
|
| Et de toute façon, si un son est en train d'être
joué et que tu veux
| en jouer un autre, le premier est interrompu.
Donc en asynchrone, je
| ne vois pas quel est le problème du Troll.
|
Avatar
LE TROLL
Jean-Marc

Bonjour cher Parci (moni)

Le problème, est:
Qu'un son A de 15s, joué 10s (on lui doit 5s) et
coupé par:

PlaySound vbNullString, ByVal 0&, 0...
+
un son B de 10s, par exemple.
------------
A la prochaine occasion où est appelé le son A, il
va faire:
son A en totalité (normal, 15s) + FIN du son A
d'avant, de 5s qui a été coupé...
------------
Ou encore, si tu coupes le son A une seconde fois
à 5s (manque 10)
A la prochaine occasion où est appelé le son A, il
va faire:
son A + son A de 5 der secondes + son A de 10 der
secondes.

A part si je m'y suis mal pris, quand un son est
interrompu, dès qu'il est rappelé, il joue le
reste, ok, et ainsi à chaque fois, sauf le moment
où il ne sera pas interrompu, la, il va se jouer,
plus jouer tout ce qu'il n'a pas pu jouer pour
raison d'interruption précédemment.

Un exemple pratique, en fait, c'est une belote
pour aveugle:
Le son énonce mon jeu Sud, supposons:
pique: as; 10; roi
A "10" Sud joue son "10", et donc coupe le son,
qui n'a pas pu dire "roi"...
tour suivant, je n'ai plus que:
pique: as + roi
Le son va lire ce qu'il y a : pique: As, Roi
Et va rajouter "Roi", q'il n'avait pas pu dire
pour coupure, soit As, Roi, Roi...

Je vais tenter de t'en faire la démonstration par
une petite application, si j'ai le temps...

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jean-marc"
a écrit
dans le message de news:
47a5a179$0$2992$
| parci wrote:
| > On Sat, 2 Feb 2008 23:22:54 +0100, "Jean-marc"
| > wrote:
| >
| >> La réponse est : PENDANT.
| >
| > Pendant, c'était le mot que je cherchais ...
| >
| > /.../
| >
| >> La solution est bien sur prévue : jouer les
sons
| >> en mode Asynchrone. Mais alors ils ne sont
pas interruptibles
| >> (et de surcroit désynchronisés, du coup ...).
| >
| > Ben si, ils sont bien interruptibles avec :
| >
| > PlaySound vbNullString, ByVal 0&, 0
|
|
| Bien sur. Ca a même déjà été dit.
|
|
| > Et de toute façon, si un son est en train
d'être joué et que tu veux
| > en jouer un autre, le premier est interrompu.
Donc en asynchrone, je
| > ne vois pas quel est le problème du Troll.
|
| En réalité, moi non plus. Il n'y a pas de
problème technique.
| Mais je peux voir le problème sous-jacent, qui
est ici très clairement
| un problème de design auquel aucune solution ne
peut être
| apportée sur un newsgroup comme celui-ci...
|
| --
| Jean-marc Noury (jean_marc_n2)
| Microsoft MVP - Visual Basic
| FAQ VB: http://faq.vb.free.fr/
| mailto: remove '_no_spam_' ;

|
|
|
|
Avatar
LE TROLL
Tiens, si tu veux jeter un oeil pour voir
le problème, ici:

http://mesromans.free.fr/testSON.zip

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"parci" a écrit dans le message
de news:

| On Sat, 2 Feb 2008 23:22:54 +0100, "Jean-marc"
| wrote:
|
| >La réponse est : PENDANT.
|
| Pendant, c'était le mot que je cherchais ...
|
| /.../
|
| >La solution est bien sur prévue : jouer les
sons
| >en mode Asynchrone. Mais alors ils ne sont pas
interruptibles
| >(et de surcroit désynchronisés, du coup ...).
|
| Ben si, ils sont bien interruptibles avec :
|
| PlaySound vbNullString, ByVal 0&, 0
|
| Et de toute façon, si un son est en train d'être
joué et que tu veux
| en jouer un autre, le premier est interrompu.
Donc en asynchrone, je
| ne vois pas quel est le problème du Troll.
|
Avatar
LE TROLL
Tiens, si tu veux jeter un oeil pour voir
le problème, ici:

http://mesromans.free.fr/testSON.zip

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jean-marc"
a écrit
dans le message de news:
47a5a179$0$2992$
| parci wrote:
| > On Sat, 2 Feb 2008 23:22:54 +0100, "Jean-marc"
| > wrote:
| >
| >> La réponse est : PENDANT.
| >
| > Pendant, c'était le mot que je cherchais ...
| >
| > /.../
| >
| >> La solution est bien sur prévue : jouer les
sons
| >> en mode Asynchrone. Mais alors ils ne sont
pas interruptibles
| >> (et de surcroit désynchronisés, du coup ...).
| >
| > Ben si, ils sont bien interruptibles avec :
| >
| > PlaySound vbNullString, ByVal 0&, 0
|
|
| Bien sur. Ca a même déjà été dit.
|
|
| > Et de toute façon, si un son est en train
d'être joué et que tu veux
| > en jouer un autre, le premier est interrompu.
Donc en asynchrone, je
| > ne vois pas quel est le problème du Troll.
|
| En réalité, moi non plus. Il n'y a pas de
problème technique.
| Mais je peux voir le problème sous-jacent, qui
est ici très clairement
| un problème de design auquel aucune solution ne
peut être
| apportée sur un newsgroup comme celui-ci...
|
| --
| Jean-marc Noury (jean_marc_n2)
| Microsoft MVP - Visual Basic
| FAQ VB: http://faq.vb.free.fr/
| mailto: remove '_no_spam_' ;

|
|
|
|
Avatar
Jean-marc
LE TROLL wrote:
Tiens, si tu veux jeter un oeil pour voir
le problème, ici:

http://mesromans.free.fr/testSON.zip



Ton programme se comporte de façon absolument normale.
Dans command1, tu joues en séquence les sons 0 à 9
dans command2, à la demande, tu joues un autre son.

Tu cliques sur command1.
Il commence à jouer : normal
tu cliques sur command2
Grace aux Doevents de Command1, tu permets au programme
de servir COmmand2; Le sons "boudin" est joué. C'est normal.
Puis le son se termine.
COmmand1 se porsuit donc.
Tout ça est normal, c'est le comportement attendu.

Tu voudais qu'après Command2, Command1 arrete son exécution.
Rien de plus facile avec un petit chien de garde dans Command2
qui prévient Command1 qu'il doit s'arréter.

Voici ton code corrigé, qui a maintenant le comportement
que tu souhaites.
Tu n'a plus qu'à adapter à ton programme, mais le principe est la:

PS: j'ai mis les sons dans un tableau, histoire de rendre ça un peu
vivable. Mais tu organises comme tu veux évidemment.


Option Explicit

Private Declare Function sndPlaySound Lib "winmm.dll" Alias _
"sndPlaySoundA" (ByVal lpszSoundName As String,
ByVal uFlags As Long) As Long

Private Const MAX_SONS As Long = 100

Dim sons(MAX_SONS) As String
Dim watch_dog_CMD2 As Boolean

Sub Form_Load()

Dim i As Long

For i = 0 To 9
sons(i) = App.Path & "" & Trim$(Str$(i)) & ".wav"
Next i

End Sub


Sub Command1_Click() ' second son
Dim i As Long

watch_dog_CMD2 = False
For i = 0 To 9
sndPlaySound (sons(i)), 0&
DoEvents
If watch_dog_CMD2 Then
Exit For
End If
Next i
watch_dog_CMD2 = False
End Sub

Sub Command2_Click() ' second son

watch_dog_CMD2 = True
sndPlaySound "boudin.wav", 0&
End Sub


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
LE TROLL
Ok, je comprend, merci, il suffit donc de
sortir... Moi, je cherchais une commande qui purge
le son... Ben merci encore :o)


--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jean-marc"
a écrit
dans le message de news:
47a5c5d4$0$2994$
| LE TROLL wrote:
| > Tiens, si tu veux jeter un oeil pour
voir
| > le problème, ici:
| >
| > http://mesromans.free.fr/testSON.zip
|
| Ton programme se comporte de façon absolument
normale.
| Dans command1, tu joues en séquence les sons 0 à
9
| dans command2, à la demande, tu joues un autre
son.
|
| Tu cliques sur command1.
| Il commence à jouer : normal
| tu cliques sur command2
| Grace aux Doevents de Command1, tu permets au
programme
| de servir COmmand2; Le sons "boudin" est joué.
C'est normal.
| Puis le son se termine.
| COmmand1 se porsuit donc.
| Tout ça est normal, c'est le comportement
attendu.
|
| Tu voudais qu'après Command2, Command1 arrete
son exécution.
| Rien de plus facile avec un petit chien de garde
dans Command2
| qui prévient Command1 qu'il doit s'arréter.
|
| Voici ton code corrigé, qui a maintenant le
comportement
| que tu souhaites.
| Tu n'a plus qu'à adapter à ton programme, mais
le principe est la:
|
| PS: j'ai mis les sons dans un tableau, histoire
de rendre ça un peu
| vivable. Mais tu organises comme tu veux
évidemment.
|
|
| Option Explicit
|
| Private Declare Function sndPlaySound Lib
"winmm.dll" Alias _
| "sndPlaySoundA" (ByVal
lpszSoundName As String,
| ByVal uFlags As Long) As Long
|
| Private Const MAX_SONS As Long = 100
|
| Dim sons(MAX_SONS) As String
| Dim watch_dog_CMD2 As Boolean
|
| Sub Form_Load()
|
| Dim i As Long
|
| For i = 0 To 9
| sons(i) = App.Path & "" & Trim$(Str$(i))
& ".wav"
| Next i
|
| End Sub
|
|
| Sub Command1_Click() ' second son
| Dim i As Long
|
| watch_dog_CMD2 = False
| For i = 0 To 9
| sndPlaySound (sons(i)), 0&
| DoEvents
| If watch_dog_CMD2 Then
| Exit For
| End If
| Next i
| watch_dog_CMD2 = False
| End Sub
|
| Sub Command2_Click() ' second son
|
| watch_dog_CMD2 = True
| sndPlaySound "boudin.wav", 0&
| End Sub
|
|
| --
| Jean-marc Noury (jean_marc_n2)
| Microsoft MVP - Visual Basic
| FAQ VB: http://faq.vb.free.fr/
| mailto: remove '_no_spam_' ;

|
|
|
|
Avatar
Jean-marc
LE TROLL wrote:
Ok, je comprend, merci, il suffit donc de
sortir... Moi, je cherchais une commande qui purge
le son... Ben merci encore :o)



M%erci du retour. Bonne suite.


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
1 2