Page 1 sur 1

thread open_window

Publié : mar. 01/sept./2009 9:21
par Le psychopathe
J'ai des soucis pour gerer les messages dans differents editor gadget de fenetre differentes.

En gros imaginez MSN, quand on reçoit un message on met le message dans la bone fentre de discution ou on en ouvre une. Mais cela bug en passant par des list. Comme c'est une liste globale, l'élément courant doit bouger en mêmen temps à cause des thread, provoquant ainsi une erreur.

Code en version raccourci : non fonctionnel

Code : Tout sélectionner

Global LargeurInterne = 160
Global HauteurInterne = 200
Global nom$

Global Integer.i = 20
Global CHARACTER.c = 0
Global activeuser = 0
Global activepassword = 0
Global numero = 100
Global i.q = 0

Structure Fenetres
  Numero.l
  id.l
  Name$
  Message$
EndStructure
Global NewList fenetre.Fenetres()
Global Name$
Global ValideConnection = 0

Procedure Open_Window_client(Numero)
Debug "procedure"
Debug i
Debug numero
  ForEach fenetre()
      If fenetre()\Numero = Numero
      Nom$ = fenetre()\Name$
      Break
      EndIf
   Next
  
  
  
  
  If OpenWindow(numero, 249, 112, 600, 300, Nom$,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar )
   
    Debug "fenetre ouverte"
      EditorGadget(numero+1, 0, 0, 600, 280)
      SendMessage_(GadgetID(numero+1), #EM_SETTARGETDEVICE, #Null, 0)
      StringGadget(numero+2, 0, 280, 610, 20, "")
      SetGadgetColor(numero+1, #PB_Gadget_BackColor, $000000)
      SetGadgetColor(numero+1, #PB_Gadget_FrontColor, $FFFFFF)   
      SetGadgetColor(numero+2, #PB_Gadget_BackColor, $000000)
      SetGadgetColor(numero+2, #PB_Gadget_FrontColor, $FFFFFF)   
      
      
      
      Repeat
      If FirstElement(fenetre()) <> 0
      ForEach fenetre()
      If fenetre()\Name$ = Nom$
        If fenetre()\Message$ <> ""
          If fenetre()\id = 0
            AddGadgetItem(numero+1, -1, Nom$ + " : " + fenetre()\Message$) 
            SendMessage_(GadgetID(numero+1),#EM_LINESCROLL,0,1)
            fenetre()\Message$ = ""
            Break
          EndIf
        EndIf
      
      
        If fenetre()\id = 1
          AddGadgetItem(numero+1, -1, Nom$ + " : " + fenetre()\Message$) 
          DisableGadget(numero+2, 1)
          fenetre()\Name$ = "NONAME"
          Nom$ = "NONAME"
          DeleteElement(fenetre()) 
          Break
        EndIf
      EndIf
      Next
      EndIf
      
      
      If GetAsyncKeyState_(#VK_RETURN)
      
       If numero+2 = GetActiveGadget()
       
         If GetGadgetText(numero+2) <> ""
         Debug i
       
         sendmessage(i,#CLIENT_SEND_USER_MESSAGE,Nom$ + "(|)" + GetGadgetText(numero+2))
         
         AddGadgetItem(numero+1, -1, Name$ + " : " + GetGadgetText(numero+2)) 
         SendMessage_(GadgetID(numero+1),#EM_LINESCROLL,0,1)
         SetGadgetText(numero+2,"")
          EndIf
        EndIf
      EndIf
      
      EventID = WindowEvent()
      If ValideConnection = 0
       
           EventID =   #PB_Event_CloseWindow   
      EndIf
                       
                                
            Until EventID =   #PB_Event_CloseWindow  
            
              ForEach fenetre()
      If fenetre()\Name$ = Nom$
          
      DeleteElement(fenetre())
      Break
      EndIf
      Next
      
    EndIf
  
EndProcedure







InitNetwork()
Global depart.l, ping.l


i = OpenNetworkConnection("127.0.0.1",6831)
Debug i
If i

Name$ = "NONAME"
HOSTNAM$ = Hostname()


open_window_0()
 
 
 Repeat

Event = NetworkClientEvent(i)

If event = #PB_NetworkEvent_Data

*Buffer = AllocateMemory(1000)
  ReceiveNetworkData(i, *Buffer, 1000)
  Result = PeekL(*Buffer)

  

  Select Result
 
    
  
    Case #SERVER_SEND_USER_MESSAGE
    temp$ = PeekS(*Buffer+4)
    NomClient$ = Left(temp$,FindString(temp$, "(|)", 1)-1 )
    MessageClient$ = Right(temp$,(Len(temp$) - (FindString(temp$, "(|)", 1)+2 )) )
    
    
    ;Reception d'un message
    ;-------------------------------------------------
    ; La fenetre est déjà ouverte
   If FirstElement(fenetre()) <> 0
        ForEach fenetre()
          If fenetre()\Name$ = NomClient$
          fenetre()\Message$ = MessageClient$
          Goto saute
          EndIf
        Next
     EndIf
        
        AddElement(fenetre())
        fenetre()\Numero = numero
        fenetre()\Name$  = NomClient$
        fenetre()\Message$ = MessageClient$
        fenetre()\id = 0
        CreateThread(@Open_Window_client(),numero) ; on ouvre une nouvelle fenetre

        numero = numero + 3
        

    
   
  
  
  
    
    
              
 
  
  
  
  
  
  
 
      
  
  
  
  
  
  Case  #SERVER_SEND_SUPP_CLIENT
  temp$ = PeekS(*Buffer+4)
  For a=0 To CountGadgetItems(#liste_utilisateurs)

  If GetGadgetItemText(#liste_utilisateurs,a) = temp$
  RemoveGadgetItem(#liste_utilisateurs, a)
  Break
  EndIf
  Next
ForEach fenetre()
Debug "Disconnect"
Debug temp$
  If fenetre()\Name$ = temp$
  Debug "Disconnect ok"
  fenetre()\Message$ = "Vient de se déconnecter, les messages ne lui sauront plus transmis"
  fenetre()\id = 1
 Break
 EndIf
Next  
  
  
    
  If *Buffer <> #Null
FreeMemory(*buffer)
EndIf
  EndSelect
   

  
  


EndIf


Event = WindowEvent() 

 Select Event
 
      Case #PB_Event_Gadget  ; evenement sur un gadget
 
          Select EventGadget() ; on cherche sur quel gadget
          
                         
               
              
                
               Case #liste_utilisateurs
               If EventType() =  #PB_EventType_LeftDoubleClick
               If GetGadgetState(#liste_utilisateurs) <> -1
                Nom$ = GetGadgetText(#liste_utilisateurs)
                If FirstElement(fenetre()) <> 0
                ForEach fenetre()
                If fenetre()\Name$ = Nom$
                SetActiveWindow(fenetre()\Numero)
                Goto saute
                EndIf
                Next
               EndIf
               ;fenetre n'existe pas
               AddElement(fenetre())
                fenetre()\Numero = numero
                fenetre()\Name$  = Nom$
                fenetre()\Message$ = ""
                fenetre()\id = 0
                CreateThread(@Open_Window_client(),numero)

                numero = numero + 3
                EndIf
                EndIf

               
               
               
                saute:  
          EndSelect
EndSelect
  

ForEver


 
 
 Else
               MessageRequester("Information","Impossible de se connecter au serveur",#PB_MessageRequester_Ok)

 
 EndIf
 

Publié : mar. 01/sept./2009 10:56
par Atomo
Utilises des Mutex, avant chaque appel à ta liste tu fais un lockmutex() et unlockmutex() quand tu as fini, ça devrait régler ton problème.