SLEEP NON BLOQUANT

korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 - 23 août 2003 à 15:21
 Delphi - 22 juin 2019 à 14:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12719-sleep-non-bloquant

La ligne "call [EAX].TApplication.ProcessMessages" est fausse. Le compilateur s'arrête dessus avec une énorme erreur !

Il faut vérifier ce que vous publiez avant de la faire parce que dans le cas contraire c'est ridicule !
manu1506 Messages postés 54 Date d'inscription jeudi 13 novembre 2003 Statut Membre Dernière intervention 25 avril 2012
20 juin 2007 à 15:40
Et utiliser un Timer, ce ne serait pas plus simple?
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
26 janv. 2007 à 17:04
OUIN ! ça bloque aussi pour moi :'( Delphi 7 Enterprise.
Quelqu'un une autre soluce pour faire une pause, une attente sans bloquer ? =) merci
LeGrizz Messages postés 1 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 17 janvier 2006
17 janv. 2006 à 17:36
Je n'ai aucun problème sous Delphi 7 et ça résoud parfaitement mon problème.

Merci
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
30 oct. 2005 à 23:11
Delphi 7 et moi ca me bloque tout, ^^

pas grave mais merci ;)
retd Messages postés 1 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 2 juillet 2004
2 juil. 2004 à 16:27
Juste une info pour tester la version de Delphi sur une plage:
{$IF RTLVersion >= 14} // si delphi6 ou supérieur
...
{$IFEND}

RTLVersion est définie dans System.pas

@+
Manu
Sylvainlefou Messages postés 43 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 15 février 2006
27 mars 2004 à 10:36
Semble ne pas marcher sous delphi 7 et XP
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
2 févr. 2004 à 23:29
J'comprend pôôô !
Je suis sous delphi 6 là... j'ai recopié la fonction de cam91, essayé avec des valeurs allant de 1 à 4 000 000 000 ca ne fait aucune différence ... C'est quoi ce bins ?
Sinon je vais passer à delphi 7... si je résume, je dois passer à quelS codeS (mieux optimisé etc ...) ???

MERCI d'avance !
cs_AnAcOnDa Messages postés 30 Date d'inscription mardi 13 novembre 2001 Statut Membre Dernière intervention 17 novembre 2003
17 nov. 2003 à 06:48
(sous delphi7 même avec les modifications c'est toujours bloquant)
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
25 sept. 2003 à 17:00
{$IfDef VER140 or higher} // si delphi 6
mov eax,edi
call TApplication.ProcessMessages
{$else}
call [EAX].TApplication.ProcessMessages
{$endif}

moi aussi sous delphi6 ça plantait

reste à voir si ça fonctionne sous 5 ?

bravo encore !

yve
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
25 août 2003 à 09:21
lol :)

C'était effectivement bien çà, dommage qu'on puisse pas faire :

{$if ver >= 150}
mov eax,edi
call TApplication.ProcessMessages
{$else}
call [EAX].TApplication.ProcessMessages
{$endif}
cs_cam91 Messages postés 19 Date d'inscription dimanche 9 juin 2002 Statut Membre Dernière intervention 4 février 2006
25 août 2003 à 00:33
J'ai vérifié, on peut effectivement réaliser une compilation conditionelle, pour cela il suffit d'ajouter:

{$IfDef VER150} //pour Delphi 7
mov eax,edi
call TApplication.ProcessMessages
{$Else}
call [EAX].TApplication.ProcessMessages
{$EndIf}

VER80 pour Delphi1
VER90 pour Delphi2
VER100 pour Delphi3
VER120 pour Delphi4
VER130 pour Delphi5
VER140 pour Delphi6
VER150 pour Delphi7
Voila, désolé de t'avoir coupé l'herbe sous les pieds ;-)
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
24 août 2003 à 16:02
Tout d'abord merci pour vos compliments et remarques, çà fait bien plaisir ! ;-)

Et merci cam91 pour la version améliorée, c'est effectivement plus propre (et un poil plus rapide, lol) sans les push/pop dans la boucle ! Mais on doit pouvoir utiliser des tests dans le code, non ? Un peu comme les #ifdef en C, çà ferait une seule procédure pour toutes les versions de Delphi... J'ai déjà vu des codes qui en utilisaient, mais je sais plus comment çà marche... Je verrais çà demain au taf, à moins que quelqu'un me coupe l'herbe sous le pied, lol ;-)
cs_cam91 Messages postés 19 Date d'inscription dimanche 9 juin 2002 Statut Membre Dernière intervention 4 février 2006
23 août 2003 à 23:44
Tout d'abord merci beaucoup pour ton code qui répond à un problème essentiel de gestion du temps. Je l'ai testé et il fonctionne à merveille sous Delphi 3, cependant pour la version 7 que j'utilise, le compilateur ne reconnait pas l'instruction call[EAX].TApplication.ProcessMessages. J'ai donc repris l'idée pour l'appliquée aux dernières versions de Delphi:

procedure TForm1.Pause2(t:DWORD);
asm
push esi
push edi
mov esi,edx
call GetTickCount
add esi,eax
mov edi,Application
@attente:
push 1
call sleep
mov eax,edi //ou rien (selon version)
call TApplication.ProcessMessages //où call [edi].TApplication.ProcessMessages
call GetTickCount
cmp esi,eax
jae @attente
pop edi
pop esi
end;

Comme tu peux le constater j'ai également optimisé le code qui devient plus court, en effet les 3 call ne modifient pas les registres ebx,esi et edi. Mais on peut toujours faire mieux ;-)
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
23 août 2003 à 15:21
Fonctionne parfaitement sous Delphi 4.
Me semble remplacer très avantageusement Sleep !
Bravo et merci pour ce code, Nebula :-)
Rejoignez-nous