seit PB 5.x kann man ja OpenWindow, WaitWindowEvent ... nur noch im MainThread benutzen. Ich habe hier aktuell in PB Programm das ca 3000 Zeilen groß ist (und das ist gerade mal der Server). Wenn ich nun alle Window Dinge in den MainThread packe, wo außerdem schon die ganzen NetworkEvents sind, dann sieht der Code extrem unübersichtlich aus.
Ok, man kann natürlich die Compiler kurzzeitig ausschalten und dann trotzdem OpenWindow in einem Thread aufrufen. Da meine Software aber auch unter Linux laufen soll, möchte ich das trotzdem nicht verwenden. Das wurde ja scheinbar eingeführt, weil andere Betriebssysteme damit nicht klar kommen.
Ich poste jetzt einfach mal die Struktur von meinem Code (gekürzt aufs nötigste). Fällt euch da eine bessere und übersichtlichere Strukturierung für ein?
Code: Alles auswählen
Procedure Key()
For n=0 To 255
If GetAsyncKeyState_(n)
ProcedureReturn n
EndIf
Next
EndProcedure
Enumeration
#ScrollArea_1
#Abmelden
#NeuStarten
#Herunterfahren
#VPN
#ScrollArea_2
#Ok_Abmelden
#Ok_NeuStarten
#Ok_Herunterfahren
#Progress_Download
#Menu_Downloaden
#Menu_Umbenennen
#Menu_Loschen
EndEnumeration
Procedure GadgetCleaner()
If IsGadget(#VPN)
FreeGadget(#VPN)
EndIf
EndProcedure
Procedure Abmelden_Area()
GadgetCleaner()
UseGadgetList(WindowID(0))
ScrollAreaGadget(#ScrollArea_2, 300, 0, 300, 650, 290, 640, 1)
ButtonGadget(#Ok_Abmelden, 50, 610, 210, 30, "Abmelden OK")
CloseGadgetList()
EndProcedure
Procedure NeuStarten_Area()
GadgetCleaner()
UseGadgetList(WindowID(0))
ScrollAreaGadget(#ScrollArea_2, 300, 0, 300, 650, 290, 640, 1)
ButtonGadget(#Ok_NeuStarten, 50, 610, 210, 30, "NeuStarten OK")
CloseGadgetList()
EndProcedure
Procedure Herunterfahren_Area()
GadgetCleaner()
UseGadgetList(WindowID(0))
ScrollAreaGadget(#ScrollArea_2, 300, 0, 300, 650, 290, 640, 1)
ButtonGadget(#Ok_Herunterfahren, 50, 610, 210, 30, "Herunterfahren OK")
CloseGadgetList()
EndProcedure
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 4000
Buffer = AllocateMemory(1000000)
If CreateNetworkServer(0, Port)
Repeat
Delay(200)
SEvent = NetworkServerEvent()
If SEvent
Debug "event"
ClientID = EventClient()
Select SEvent
Case #PB_NetworkEvent_Connect
If OpenWindow(0, 30, 60, 600, 650, "PureBasic - Gadget Demonstration", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget)
ScrollAreaGadget(#ScrollArea_1, 0, 0, 300, 650, 295, 625, 1)
ButtonGadget(#Abmelden, 10, 15, 250, 30, "Abmelden")
ButtonGadget(#NeuStarten, 10, 50, 250, 30, "#NeuStarten")
ButtonGadget(#Herunterfahren, 10, 85, 250, 30, "Herunterfahren")
CloseGadgetList()
ProgressBarGadget(#Progress_Download, 10, 620, 250, 25, 0, 99)
If CreatePopupMenu(0)
MenuItem(#Menu_Downloaden, "Downloaden")
MenuItem(#Menu_Umbenennen, "Umbenennen")
MenuItem(#Menu_Loschen, "Löschen")
EndIf
Repeat
EventID = WaitWindowEvent()
If Key() = #VK_F5
If IsGadget(#VPN)
SendNetworkString(ClientID, "VPN"+Seperator$+VPN_Aktueller_Pfad$)
ClearGadgetItems(#VPN)
Delay(100)
EndIf
EndIf
If EventID = #PB_Event_Gadget
Select EventGadget()
Case #Abmelden
Abmelden_Area()
Case #NeuStarten
NeuStarten_Area()
Case #Herunterfahren
Herunterfahren_Area()
;Case xxxxxxx
;..........
;........
;......
;Case xxxxxxx
;.....
Case #Ok_Abmelden
SendNetworkString(ClientID, "Abmelden")
Case #Ok_NeuStarten
SendNetworkString(ClientID, "Neustarten")
Case #Ok_Herunterfahren
SendNetworkString(ClientID, "Herunterfahren")
; Case OK_xxxxxxxxxxx
;......
;.....
; Case OK_xxxxxxxxxxx
;.......
EndSelect
EndIf
If EventID = #PB_Event_Menu
Select EventMenu()
Case #Menu_Loschen
If MessageRequester("Löschen?", "Wollen sie das Objekt wirklich löschen?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
Loschen_Dateiname$ = VPN_Aktueller_Pfad$+GetGadgetText(#VPN)
If FindString(Loschen_Dateiname$, ".", 0)
SendNetworkString(ClientID, "LöschenDatei"+Seperator$+Loschen_Dateiname$)
Else
SendNetworkString(ClientID, "LöschenOrdner"+Seperator$+Loschen_Dateiname$)
EndIf
EndIf
; Case #Menu_xxx
; .........
;Case #Menu_xxx
;..........
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
SendNetworkString(ClientID, "Close")
CloseWindow(0)
EndIf
End
Case #PB_NetworkEvent_Data
*Buffer = AllocateMemory(1024)
If *Buffer
RcvBytes = ReceiveNetworkData(ClientID, *Buffer, 1024)
If RcvBytes > 0
Line$ = PeekS(*Buffer, 5)
If Left(Line$, 5) = "FILE:"
;If NetworkReceiveFile(ClientID, *Buffer, RcvBytes, Tempdir$+"Empf\"+Str(Aktuelle_DownloadDatei)+".teil")
;......
;....
;......
;EndIf
Else
String$ = PeekS(*Buffer)
Debug String$
Name$ = StringField(String$, 2, Seperator$)
Debug String$+Name$
Select StringField(String$, 1, Seperator$)
Case "Fehler"
If Name$ = "Prozess Dll nicht gefunden"
MessageRequester("xxx", "xxx")
EndIf
If Name$ = "Prozess existiert nicht"
MessageRequester("xxx", "xxx")
EndIf
If Name$ = "Prozess konnte nicht beendet werden"
MessageRequester("xxx", "xxx")
EndIf
If Name$ = "Erfolgreich!!!"
MessageRequester("xxx", "xxx")
EndIf
; Case xxxxxxxx
;.............
; Case xxxxxxxxx
EndSelect
EndIf
EndIf
FreeMemory(*Buffer)
EndIf
Case #PB_NetworkEvent_Disconnect
Debug "endeee der connection case 4"
CloseNetworkConnection(ClientID)
CloseNetworkServer(0)
; MessageRequester("Trennug", "Der Client wurde getrennt", 0)
End
EndSelect
EndIf
Until Quit = 1
EndIf
End