JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Un minuteur Mar 22 Avr 2014 - 16:53 | |
| Le problème (déjà évoqué dans le post 'Feux de signalisation'): je lance un Execute_Wait qui met beaucoup de temps à s'exécuter (plusieurs minutes) et pendant ce temps il ne se passe rien à l'écran, ce qui est un peu... angoissant. Il y a bien l'affichage du feu orange (voir à côté), mais c'est tout aussi statique. Alors j'ai fait un petit exécutable indépendant: Minuteur.exe, qui affiche l'écoulement du temps sous la forme mm:ss Cet exécutable est appelé par une Sub Minuteur() du programme principal qui le lance avant l'Execute_wait, et l'arrête à la sortie. Pendant tout la durée de l'exécution du programme appelé, le décompte du temps est affiché. L'exécutable indépendant, à compiler comme Minuteur.exe: - Code:
-
' Minuteur DIM x%,y%,w%,h%,td%,t%,m%,s%,d%,a$,f$ f$ = "C:\TEMP\Fminut.txt" IF FILE_EXISTS(f$) = 0 THEN TERMINATE FILE_OPEN_READ 1, f$ FILE_READLN 1,a$: x% = VAL(a$) FILE_READLN 1,a$: y% = VAL(a$) FILE_CLOSE 1 w% = 220: h% = 86 TOP 0,y%: LEFT 0,x%: WIDTH 0,w%: HEIGHT 0,h%: BORDER_HIDE 0 COLOR 0,255,255,0 FONT_NAME 0,"Lucida Console": FONT_SIZE 0,48: FONT_BOLD 0: ' PRINT_TARGET_IS 1 td% = 3600*VAL(LEFT$(TIME$,2))+60*VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2)) WHILE FILE_EXISTS(f$) = 1 t% = 3600*VAL(LEFT$(TIME$,2))+60*VAL(MID$(TIME$,4,2))+VAL(RIGHT$(TIME$,2)) d% = t%-td%: d% = d%-INT(d%/3600) m% = INT(d%/60): s% = d%-60*m% a$ = RIGHT$("0"+STR$(m%),2)+":"+RIGHT$("0"+STR$(s%),2) PRINT_LOCATE 10,13: PRINT a$ WAIT 1000 END_WHILE TERMINATE La sub d'appel, à insérer dans le programme principal: - Code:
-
SUB Minuteur(fct%,x%,y%) ' Affichage d'un minuteur indépendant en minutes:secondes en x%,y% de l'écran ' fct%=1: lancement, fct%=0: arrêt IF fct% = 1 FILE_OPEN_WRITE 1,"C:\TEMP\Fminut.txt" FILE_WRITELN 1,STR$(x%): FILE_WRITELN 1,STR$(y%) FILE_CLOSE 1 EXECUTE "C:\PANORAMIC\Minuteur.exe": ' programme d'affichage du minuteur ELSE FILE_DELETE "C:\TEMP\Fminut.txt": ' arrêt du minuteur END_IF END_SUB C'est tout simple et un peu gadget, mais ça m'ennuyait de perdre complètement la main pendant l'exécution de l'execute_wait. NB les chemins sont à adapter, notamment le chemin de l'exécutable Minuteur.exe dans la sub. | |
|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un minuteur Mar 22 Avr 2014 - 17:12 | |
| Pas mal et ça peut donner des idées. En fait c'est le début de la programmation multi taches en temps partager. Si Nardo était là, il pourrait nous faire une petite théorie la dessus, mais bon, si on arrive à synchroniser plusieurs exe, ça permet d'executer un deuxième programme quand le premier doit attendre. Avec les fonctions de la DLL de Klaus, on pourrait imaginer par exemple que le programme externe vienne écrire quelque chose dans la fenêtre du programme qui doit attendre. Enfin ce n'est qu'une idée, mais je pense qu'elle est assez réaliste. Il faut juste que le programme appelant envoit le handle de la fenêtre graphique dans lequel le programme appelé doit écrire. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un minuteur Mar 22 Avr 2014 - 17:23 | |
| KGF.dll a des fonctions d'envoi et de réception de messages entre programmes Panoramic. On peut très bien envisager une communication pour synchroniser deux ou plusieurs programmes. Si vous êtes en manque de protocoles de communication, je peux en fournir - c'est une longue habitude. | |
|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un minuteur Mar 22 Avr 2014 - 17:44 | |
| Je ne vais pas diverger du minuteur sur ce post, mais c'est vrai que je pense que l'on ne l'utilise pas assez dans nos programmes. Bon il faut dire que ce sont pour des usages spécifiques, mais il y a des tas de programmes ou une masse de calcul doivent être fait (par exemple pour la 3D, pour préparer des images, etc ...) et rien n'oblige à avoir une fenêtre figée si on utilise ce procédé de programme externe qui viendrait écrire sur la fenêtre du programme 'bloqué' par une opération dont le résultat est attendu avant de continuer. | |
|