Page 1 sur 2

Apres un Runprogram perte de mémoire du ScreenOutput()

Publié : ven. 12/nov./2004 12:20
par Thyphoon
Apres avoir lancer un fichiet .bat via Runprogram

Code : Tout sélectionner

RunProgram("play.bat", "", "", 1 | 2)"
 
le fichier bat lance un jeu
a son retour dans mon programme il me fait une erreur a cette ligne

Code : Tout sélectionner

StartDrawing(ScreenOutput())
et me dit "The Specified output is NULL (0 value)" Mais je comprends pas du tout pourquoi ...est ce un bug ? il y a moyen de contourner ce problème ?

Publié : ven. 12/nov./2004 12:31
par Patrick88
il faudrait peut-être faire un close de ton startdrawing avant d'excuter le bat

et faire un startdrawing au moment ou tu reviens si tu as besoin de dessiner qu'e'chose de dedans ...

pat

Publié : ven. 12/nov./2004 13:11
par Thyphoon
le problème c'est que ça vient apres ça se passe dans une boucle
voilà en gros le principe du code

Code : Tout sélectionner

#Window = 0
#Width = 640
#Height = 480
#Mode_initSp = 0 ;

;- Init DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
  CloseWindow(#Window) : End
EndIf

If #Mode_initSp = 0 Or #Mode_initSp = 1
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Arcadthy")
  OpenWindowedScreen(res, 0, 0, #Width, #Height, 0, 0, 0)
Else
  OpenScreen( #Width, #Height, 16, "Arcadthy" + ver$ )
EndIf

Repeat ; Jeu
  
  ClearScreen(0, 0, 0)
  ExamineKeyboard()

  If KeyboardPushed(#PB_Key_space)
    RunProgram("play.bat", "", "", 1)
  EndIf

StartDrawing(ScreenOutput())
    DrawingMode(4)
    Box(10, 10, 200, 200, RGB(50, 50, 50))
StopDrawing()

    FlipBuffers(0)
    If #Mode_initSp = 0 Or #Mode_initSp = 1
      While WindowEvent() : Wend ; evite le plantage clic gauche
    EndIf
Until KeyboardPushed(#PB_Key_Escape)
si le fichier play.bat lui execute un programme qui ouvre un ecran et bien j'ai le progrem si dans le fichier play.bat je met juste un "Dir" alors ça fonctionne pas d'erreur... apparement il perd la reference de l'ecran

Publié : ven. 12/nov./2004 17:08
par Thyphoon
Alors personne n'a d'idée ?
j'ai essayé en rajoutant un

Code : Tout sélectionner

Usebuffer(-1)
apres le run programme mais ça ne change rien ... j'ai l'impression qu'il pert toute information d'un screen ouvert ..... :cry:
Est ce que quelqu'un a réussi a reproduire le bug chez lui ?
Il faut que le fichier bat lance une application qui s'ouvre en plein ecran !
Moi ça le fait avec l'emulateur Mame ...

:cry: :cry: :cry: :cry:

Publié : ven. 12/nov./2004 17:38
par Anonyme2
Je ne sais pas vraiment, mais d'après ton code

Code : Tout sélectionner

RunProgram("play.bat", "", "", 1)
a le dernier paramètre à 1 et la doc dit pour ce paramètre à 1
1: Attend que le programme lancé se termine.
mais d'après cette même doc, il est dit (ce que je comprend comme son contraire)
Lance un programme externe sans suspendre l'exécution du programme en cours (exécution asynchrone).
Peut-être que Mame n'est pas fermé avant que tu n'écrive (?) et ça pourrait entraîner des problèmes (?).

Essaye de lancer le bat avec l'API CreateProcess_() et juste après avoir exécuter cette API, utilise l'API GetExitCodeProcess_() en bouclant dessus jusqu'à obtenir la fin de processus

proc\hProcess est retourné par CreateProcess_()

Code : Tout sélectionner

 ProcessState = #STILL_ACTIVE
  Repeat
  GetExitCodeProcess_(proc\hProcess, @ProcessState.l)
  Until ProcessState <> #STILL_ACTIVE
Mai je dit tout ça au pif :roll: car je ne sais pas si le problème vient de là

Publié : ven. 12/nov./2004 17:47
par Thyphoon
merci pour ton aide mais apparement ça ne vient pas de là ....
J'ai essayé apres le runprogram de mettre un delay(9000) ça ne change rien. la commande runprogramm attend bien que Mame se soit arrêté pour continuer de parcourir le code.. le delay se fait bien ...mais des que j'arrive a StartDrawing hop erreur... c'est rageant car tout mon programme est basé sur le faite d'executer des programmes annexes sous cette forme ... je vais essayer avec Shellexecute_ voir si ça fait la même chose

Publié : ven. 12/nov./2004 18:00
par Thyphoon
au dernière nouvelle ! ça marche super si je lance un truc qui fonctionne dans une fenêtre mais si c'est en plein ecran j'ai l'erreur
j'ai essayé aussi avec ShellExecute_ ça fait pareille ... :o( je comprends pas... :cry:

Publié : ven. 12/nov./2004 18:21
par filperj
Il y a le même genre de problème avec le plein écran minimisé par Alt+TAB...
Essaie de remplacer:

Code : Tout sélectionner


  StartDrawing(ScreenOutput())
  DrawingMode(4)
  Box(10, 10, 200, 200, RGB(50, 50, 50))
  StopDrawing()
  
par:

Code : Tout sélectionner


  ScreenOutput=ScreenOutput()
  If ScreenOutput And StartDrawing(ScreenOutput)
    DrawingMode(4)
    Box(10, 10, 200, 200, RGB(50, 50, 50))
    StopDrawing()
  EndIf
  
Tu sauteras une routine de dessin de temps en temps, mais ça devrai pas être gênant...

Publié : ven. 12/nov./2004 18:30
par Thyphoon
exelent filperj ! déjà ça plante plus !! parcontre je remarque mon ecran n'existe plus apres l'execution du runprogram ....trop curieux comme truc... Est ce qu'en utilisant runprogram le programe executer pourrais prendre le même ecran que mon programme et comme il le ferme a la fin lorsque je reviens a mon programme il n'existe plus ????

Publié : ven. 12/nov./2004 21:12
par filperj
Ah ben oui tiens, il n'existe plus du tout, apu, c'est bizarre :roll:
Reste peut-être la solution de faire un closescreen() avant le runprogram(), et de reconstruire ton écran après, même si ça ressemble à du rafistolage...

Publié : ven. 12/nov./2004 21:17
par Thyphoon
dit moi filperj ....c'est bien bug alors !! ou alors c'est vraiment moi qui est un problème ?
En tout cas merci de m'avoir aider !
je vais essayer de voir ce que donne un closescreen

et bien ça permet de revenir....mais j'ai l'impression que les constantes on perdu leur valeur ... et c'est marrant lorsque j'ouvre de nouveau l'ecran il rest en mode fenêtré .......
Ouiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiin pourquoi des que je veux faire quelques chose ça marche jammais ... :cry:

Publié : ven. 12/nov./2004 21:24
par filperj
Oui, c'est sûrement un bug.
Le prog en plein écran s'accapare toute la mémoire vidéo, ça c'est normal, mais on devrai récupérer sa part après.
Enfin, il me semble :roll:

Publié : ven. 12/nov./2004 21:35
par filperj
lorsque j'ouvre de nouveau l'ecran il rest en mode fenêtré .......
Là tu as dû t'embrouiller quelquepart...
Comme ça il va revenir un coup en plein écran, un coup en fenêtré:

Code : Tout sélectionner


#ProgramToRun = "play.bat"

#Window = 0
#Width = 640
#Height = 480
#Mode_initSp = 0 ;

;- Init DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
  CloseWindow(#Window) : End
EndIf

If #Mode_initSp = 0 Or #Mode_initSp = 1
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Arcadthy")
  OpenWindowedScreen(res, 0, 0, #Width, #Height, 0, 0, 0)
Else
  OpenScreen( #Width, #Height, 16, "Arcadthy" + ver$ )
EndIf

Repeat ; Jeu
  
  ClearScreen(0, 0, 0)
  ExamineKeyboard()
  
  If KeyboardReleased(#PB_Key_Space)
    CloseScreen()
    RunProgram(#ProgramToRun, "", "", 1)
    If Flipaillon&1
      OpenWindowedScreen(res, 0, 0, #Width, #Height, 0, 0, 0)
      Else
      OpenScreen( #Width, #Height, 16, "Arcadthy" + ver$ )
    EndIf
    Flipaillon+1
  EndIf
  
  scrop=ScreenOutput()
  If scrop And StartDrawing(scrop)
  DrawingMode(4)
  Box(10, 10, 200, 200, RGB(50, 50, 50))
  StopDrawing()
  EndIf
  
  FlipBuffers(0)
  If #Mode_initSp = 0 Or #Mode_initSp = 1
    While WindowEvent() : Wend ; evite le plantage clic gauche
  EndIf
Until KeyboardPushed(#PB_Key_Escape) 


Publié : ven. 12/nov./2004 21:55
par Thyphoon
Merci filperj avec ce que tu m'as indiqué je pense que je vais finir par y arriver ! En verité quand je disais que j'arrivais en mode fenêtré c'est qu'il ne finissait pas d'initialiser l'ecran normalement... dans le code que tu viens de poster je sais pas si tu as remarquer mais juste avant d'ouvrir la fenêtre en plein ecran tu vois une fenetre qui rempli tout l'ecran, et bien ça bloquait là ..
Je vais arrêter là pour ce soir ma tête va exploser sinon et demain je reprendrais ça a tête reposer ...

Si fred passe par là je serais interesser si il pouvait m'expliquer le fait qu'on perde l'ecran !

Publié : sam. 13/nov./2004 14:00
par Patrick88
j'ai lu quelque chose comme ça sur le forum anglais hier...

je vais essayer de retrouver

http://purebasic.myforums.net/viewtopic ... rawing+app

c'est pour la 3d,

je sais pas si ça va t'aider

pat