Page 1 sur 1

Problème avec Delay()

Publié : sam. 16/sept./2017 12:27
par cage
Bonjour a tous,

Je cherche a réaliser une application sleep.exe équivalente a la commande dos timeout
Syntaxe de la commande timeout: timeout/t <TimeoutInSeconds> [/nobreak]
La commande timeout affiche un décompte dans la console que je ne désire pas, c'est pourquoi je cherche a faire ma propre commande timeout (sleep.exe)
L'utilisation de la commande Delay() dans une application ligne de commande semble ne pas fonctionner.
Compilez le code suivant en test.exe et exécutez le dans une console cmd.exe, cela ne donne rien.

Code : Tout sélectionner

Delay(5000)
Le Delay(5000) n’arrête pas le déroulement du programme en mode compilé mais fonctionne correctement en mode IDE
Voici le code de l'application que je voulais créer:

Code : Tout sélectionner

EnableExplicit  ; all the variables must be declared

OnErrorGoto(?ErrorHandler)

Define count = CountProgramParameters()

Define info.s, myparam.s

Define result, seconds

Define rcode = #False

If count
  myparam = ProgramParameter(0)
  seconds = Val(myparam)
  For count = 1 To seconds
    Delay(1000)
  Next
  rcode = #True
Else
  rcode = #False
  info = "Arguments are: Sleep <seconds>" + #CRLF$
  result = MessageRequester("Sleep", info, #PB_MessageRequester_Ok|#PB_MessageRequester_Info)
EndIf

ErrorHandler:

End rcode
En complément, je voudrais pouvoir afficher directement dans la console DOS (cmd.exe) la syntaxe de la commande sleep lorsqu'on ne lui passe aucun argument.
Exemple, taper sleep dans la console DOS donnerait
Arguments are: Sleep <seconds>
en retour.
Merci pour l'aide que vous pourrez m'apporter.
cage

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 12:45
par Marc56
La commande timeout affiche un décompte dans la console que je ne désire pas, c'est pourquoi je cherche a faire ma propre commande timeout
La redirection (> null) équivalent à (> /dev/nul) unix permet de ne pas avoir d'écho console.
Exemple:

Code : Tout sélectionner

timeout /t 3 > null & echo Hello World
L'utilisation de la commande Delay() dans une application ligne de commande semble ne pas fonctionner.
Ceci fonctionne

Code : Tout sélectionner

OpenConsole()
Delay(3000) 
Print("Ready")
OpenConsole doit appelé au début du programme même si le programme est compilé en mode console et lancé depuis une console déjà ouverte.
En complément, je voudrais pouvoir afficher directement dans la console DOS (cmd.exe) la syntaxe de la commande sleep lorsqu'on ne lui passe aucun
Comme cela:

Code : Tout sélectionner

  ;result = MessageRequester("Sleep", info, #PB_MessageRequester_Ok|#PB_MessageRequester_Info)
  OpenConsole() ; <- Mieux au début du programme
  PrintN(info)

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 17:25
par cage
Merci Marc56 pour ta réponse très complète.

Je connais un peu OpenConsole() bien que je ne l'utilise pas car elle n'a pas d’intérêt pour moi.

OpenConsole() ouvre une fenêtre console alors que moi, je cherche a travailler en mode batch ou en mode console (interactif) dans une "Invite de commandes" Windows.

Une fois compilée, mon application est utilisée dans un fichier .bat ou .cmd

Le délais doit intervenir dans le batch (comme le fait timeout) et la sortie des messages aussi.

C'est là que je coince. PB ne semble pas fait pour pouvoir faire ce genre de chose. J’espère me tromper.

Si tu as une idée, je suis preneur.

Dans la réalité, je suis coincé avec plusieurs applications consoles que je n'arrive pas a créer en PB alors que je n'avais aucun soucis avec VB (et oui, je viens de VB 1 a 6 Entreprise)
cage

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 18:03
par djes
Openconsole() ouvre une console s'il n'y en a pas. Quand tu es déjà dans une console, il n'en ouvre pas... J'utilise pb pour ce genre d'applis depuis longtemps et ça fonctionne très bien, si tu as des soucis n'hésite pas on trouvera toujours !

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 18:45
par cage
Merci djes, mais non.
Voici le code test.pb que je compile en test.exe:

Code : Tout sélectionner

OpenConsole()

Delay(5000)

PrintN("Tems écoulé")
J'ouvre une "Invite de commandes" Windows par clic droit sur le menu Démarrer/Invite de commande
Je vais dans le dossier qui contient test.pb et test.exe

Code : Tout sélectionner

Y:\PB\PB2\SLEEP>test

Y:\PB\PB2\SLEEP>
Une fenêtre test s'ouvre, puis se ferme au bout de 5 secondes et je n'ai rien d'affiché dans mon "Invite de commande"
Je n'ai jamais compris pourquoi je ne peux pas utiliser certaines commandes dans un .exe non fenêtré.
Pourquoi un simple Delay(5000) ne peut pas fonctionner hors d'un OpenWindow() ou OpenConsole()
Pourquoi ne peut-on pas afficher du texte en dehors d'un OpenWindow() ou OpenConsole()
J'avoue que je suis un peu frustré sur ce coup.
Il doit bien y avoir une solution.
cage

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 19:17
par Zorro
tu compiles ce code en mode console
dans un dossier tu l'appelles "test.exe"

Code : Tout sélectionner


OpenConsole("test")
Delay(10000)
CloseConsole()
ensuite tu ouvre la console windows a l'emplacement du prg
et dans le shell , tu tapes ceci
.\test
ça va attendre 10 secondes avant de te rendre la main :)

ne pas oublier le ".\" avant la commande "test"
car il y a une protection avec Windows 10 et ce code permet de demander a win10 de lancer le code sans protection

je viens de tester chez moi ça marche :)

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 19:59
par cage
@Zorro
tu compiles ce code en mode console
J'ai du manquer quelque chose. Comment je compile en mode console ?
Autrement, j'ai toujours le même résultat, depuis la console Windows cela m'ouvre une autre fenêtre "test"
Je ne reste pas dans la console Windows.
Que je lance par test.exe ou .\test.exe

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 20:13
par Zorro
le mode console avec l'editeur officiel c'est menu "compiler"
compiler option
executable Format , tu choisis console !

avec EPB c'est menu projet "creer console"

pour ce qui est de la fenetre console, ben tu la fais disparaitre comme ça :

Code : Tout sélectionner

Import ""
      GetConsoleWindow()
EndImport


OpenConsole()

;Caché la console d'aprés le handle de la console
ShowWindow_(GetConsoleWindow(), #SW_HIDE)

Delay(10000)
CloseConsole()




Re: Problème avec Delay()

Publié : sam. 16/sept./2017 20:27
par cage
Merci Zorro

Je ne sais pas comment j'ai pu louper cette option. Certainement l'age.

Tout fonctionne comme je le veux, c'est parfait.

Encore merci a tous pour votre aide.

cage

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 20:34
par Zorro
:)

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 23:15
par djes
cage a écrit :Merci Zorro

Je ne sais pas comment j'ai pu louper cette option. Certainement l'age.

Tout fonctionne comme je le veux, c'est parfait.

Encore merci a tous pour votre aide.

cage
Tu n'es pas le seul... Ça m'est arrivé plein de fois, et c'est de pire en pire :lol:

Re: Problème avec Delay()

Publié : sam. 16/sept./2017 23:55
par cage
Voici le code qui fonctionne tel que je le souhaitais au départ.
Il ne manquait pas grand chose.

Code : Tout sélectionner

;
;************************************************************************
;Titre      : sleep.pb
;Auteur     : (C) 2017 CAGE
;Date       : 2017/09/16
;Version PB : PureBasic 5.61 (Windows - x86)
;Version PB : PureBasic 5.61 (Windows - x64)
;Compiler Options
;Compiler Options : Executable format: Console
;Compile/Run      : Create temporary executable in the source directory
;
;Libairies: aucunes
;
;************************************************************************
;

EnableExplicit  ; all the variables must be declared

OnErrorGoto(?ErrorHandler)

Define count = CountProgramParameters()

Define info.s, myparam.s

Define result, seconds

Define rcode = #False

#myhome = "pbcage.free.fr"

If count
  myparam = ProgramParameter(0)
  seconds = Val(myparam)
  For count = 1 To seconds
    Delay(1000)
  Next
  rcode = #True
Else
  OpenConsole()
    PrintN(#Null$)
    PrintN("Arguments are: Sleep <seconds>")
    PrintN(#Null$)
    PrintN(#myhome)
  CloseConsole()
  rcode = #False
EndIf

ErrorHandler:

End rcode
Voici le résultat de sleep sans argument:

Code : Tout sélectionner

Y:\PB\PB2\SLEEP>sleep

Arguments are: Sleep <seconds>

pbcage.free.fr

Y:\PB\PB2\SLEEP>
J’espère que la pratique de PB aide a rester jeune dans sa tête. 8)
cage