Page 1 sur 1

Fenêtre avec un écran sous seven problème.

Publié : jeu. 24/nov./2011 19:15
par stombretrooper
Salut !

Pour le développement de 3Arks en parallèle de la version 'officiel', je travail sur un client qui a pour but de montrer à blendman comment utiliser les codes de mise en réseau que je lui fournis.

Lors de la création de ce client 'lite', j'ai rencontré un problème que j'ai pas résolus, (blendman m'a dis qu'il avait rencontré le même problème mais il ne se souvient pas de l'astuce). En gros, quand je déplace la fenêtre contenant mon écran j'ai le droit à un "Ne répond plus", ce qui m'oblige à fermer l'application. Je rencontre ce problème à partir du moment où j'ai ouvert un écran sur la fenêtre, ce qui me fait penser que c'est lié à l'écran et/ou aux dessins, ect...

Niveau code, ma boucle ressemble à ça :

Code : Tout sélectionner

fin=#False
Repeat
  ;{ Boucle de gestion des gadgets :
  Repeat
    Event=WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        fin=#True
      Case #PB_Event_Gadget
        ;Gestion des gadgets....
    EndSelect
  Until Event=0
  ;}
  ;{ Boucle de gestion des events du jeu :
  If jeu_lance=#True
    If IsScreenActive()
      IncludeFile "boucle/refresh_affichage_element.pb"
      IncludeFile "boucle/affichage.pb"
      IncludeFile "boucle/events.pb"
    EndIf
  EndIf
  ;}
  Delay(100)
Until fin=#True
Je n'ai aucun message d'erreur dans le debugger, j'ai essayé de mettre des 'debug' un peu partout, mais non, le programme ne plante pas à un endroit précis. J'ai aussi essayé de remplacer le WindowEvent par un WaitWindowEvent(1), mais bon, ça ne fonctionne pas mieux.

Quelqu'un a-t'il rencontré le même problème ou quelqu'un a-t'il une idée de la provenance d'un tel problème ?

Re: Fenêtre avec un écran sous seven problème.

Publié : ven. 25/nov./2011 8:54
par MLD
Salut stombretrooper

Je ne comprend pas bien ton code :(
Je relève toutefois que tu utilise une fois Repeat et deux possibilités de fin de boucle avec Until
A mon avis, Il doit avoir un Until qui agit au mauvais moment. :cry:
Il est préférable de bien séparé les boucles avec deux Repeat, et deux Until :D
Actuellement si tu as Until Event=0 tu sort de la boucle définitivement, la deuxieme partie du code s'exécute, et puis plus rien.La fenêtre n'est plus pris en compte. :roll: Efin je pense :?:
Bon courage
Michel

Re: Fenêtre avec un écran sous seven problème.

Publié : ven. 25/nov./2011 11:13
par blendman
MLD : il y a bien 2 repeat dans le code et 2 until ;)

Strombre : je ne crois pas que le problème vienne de ce code, car si on fait un test simple, il n'y a pas de problème (sous xp). Mais teste-le sous 7 pour voir si ça marche (je vais tester tout à l'heure pour voir) :

Code : Tout sélectionner

InitSprite()
#window = 0
OpenWindow(#window,0,0,800,600,"")
OpenWindowedScreen(WindowID(#window),0,0,800,600,0,0,0)
fin=#False
Repeat
  ;{ Boucle de gestion des gadgets 
  Repeat
    Event=WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        fin=#True
      Case #PB_Event_Gadget
        ;Gestion des gadgets....
    EndSelect    
  Until Event=0  ;}
  ;{ Boucle de gestion des events du jeu :
  If jeu_lance=#True
    If IsScreenActive()      
    EndIf
  EndIf  ;}
  Delay(1)
Until fin=#True
Je me demande si tu ne devrais pas mettre 2 event=waitwindowsevent(1), un dans chaque boucle repeat/until

Re: Fenêtre avec un écran sous seven problème.

Publié : ven. 25/nov./2011 11:58
par MLD
@blendman
exuse :oops: Ce matin je ne devais pas etre bien réveillé. :wink:
J'ai compilé le code sous XP, le code compilé ne fonctionne pas.

Re: Fenêtre avec un écran sous seven problème.

Publié : ven. 25/nov./2011 12:38
par Ar-S
Salut,
Sous 7X64 j'ai pas de "freeze" de la fenêtre.

Code : Tout sélectionner

InitSprite()
#window = 0
If OpenWindow(#window,0,0,800,600,"")
  If OpenWindowedScreen(WindowID(#window),0,0,800,600,0,0,0)
    fin=#False
    Verif = #false
    jeu_lance=#True
    
    Repeat
      ;{ Boucle de gestion des gadgets 
      Repeat
        event=WindowEvent()
        Select event
          Case #PB_Event_CloseWindow
            fin=#True
          Case #PB_Event_Gadget
            ;Gestion des gadgets....
        EndSelect    
      Until event=0  ;}
      ;{ Boucle de gestion des events du jeu :
      If jeu_lance=#True
        If IsScreenActive()
          Verif + 1
          If Verif = #true
            MessageRequester ("Screen GFX ok","ok",#MB_OK) ;-test
            Verif + 1
          EndIf
          
        EndIf
      EndIf  ;}
      Delay(1)
    Until fin=#True
    
  EndIf
EndIf


Re: Fenêtre avec un écran sous seven problème.

Publié : ven. 25/nov./2011 23:43
par stombretrooper
Merci de vos réponses.

J'ai testé vos codes et ils marchent nickel, à mon avis le freeze de ma fenêtre ne vient pas de cette boucle, j'ai mal dûs l'identifier, est il possible qu'un bug (boucle infinis, comportement non prévus) dans un thread fasse freezer (bouh le verbe pas beau qui existe pas !) le programme ? (en sachant que j'ai aucune erreur dans le debugger purebasic) ?

Re: Fenêtre avec un écran sous seven problème.

Publié : mer. 30/nov./2011 15:37
par stombretrooper
J'ai cherché, et j'ai finis par trouver...

Il s'avère que je lançais ma fenêtre dans le thread qui gérer les réseaux (le programme client lite est composé de la boucle principal et d'un thread qui reçois les informations du serveur)... Et je penses que le fait d'ouvrir le screen dans le thread, purebasic aime pas du tout... Pour preuve, je suis passé par une variable globale, qui ouvre le screen dans la boucle principal au moment où le thread réseau incrémente la variable à l'endroit où avant j'ouvrais le screen... Et depuis plus de problème, ça marche nickel, je peux déplacer ma fenêtre. ;)

Est ce un comportement 'normal' ou je dois le signaler comme un bug de purebasic ?