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