Verhalten des gleichen Source Codes auf Windows/Linux

Für allgemeine Fragen zur Programmierung mit PureBasic.
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von Jörg Burdorf »

Hallo !

Mein Problem:

Ich habe ein kleine Anwendung erstellt, welche das Problem verdeutlicht.
In einem TextGadget wird nacheinander mit einem kurzen Delay(2000) unterschiedlicher Text gesetzt.
Erst
Windows
dann
Linux
dann
MacOS

Auf einem Windows 10 System erscheinen die verschiedenen Texte wie gewünscht hintereinander nach der Wartezeit.

Auf einem Ubuntu System (VBOX) erscheint ein leeres Textfeld und nach allen Wartezeiten der Text
MacOS, welcher der letzte gesetzte ist.

Somit ist das Verhalten für mich nicht kompatibel.
Hat jemand dazu eine Idee?

Hier der Ausschnitt aus dem Source Code um den es geht:

Code: Alles auswählen

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_1
EndEnumeration

Enumeration FormGadget
  #Text_0
  #Button_0
EndEnumeration

Declare ResizeGadgetsWindow_1()

Declare Button_0(EventType)

Procedure OpenWindow_1(x = 0, y = 0, width = 250, height = 120)
  OpenWindow(#Window_1, x, y, width, height, "Compat", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(#Text_0, 10, 10, 230, 60, "", #PB_Text_Center)
  ButtonGadget(#Button_0, 70, 80, 115, 30, "Exiit")
EndProcedure

Procedure ResizeGadgetsWindow_1()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_1)
  FormWindowHeight = WindowHeight(#Window_1)
  ResizeGadget(#Text_0, 10, 10, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Button_0, 70, 80, FormWindowWidth - 135, FormWindowHeight - 90)
EndProcedure

Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadgetsWindow_1()
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Button_0
          Button_0(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

XIncludeFile "window_1.pbf"
OpenWindow_1()

SetGadgetText(#Text_0,"Windows")
Delay(2000)
SetGadgetText(#Text_0,"Linux")
Delay(2000)
SetGadgetText(#Text_0,"MacOS")
    
Procedure button_0 (EventType)
  End   
EndProcedure
    
Repeat
    Event = WaitWindowEvent()
  
    Select EventWindow()
      Case MainWindow
        Window_1_Events(Event) 
      
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow 
Noch ein frohes neues Jahr euch allen!
Jörg
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von mk-soft »

Frohes neues :wink:

Die OS arbeiten alle etwas unterschiedlich, somit werden die Ereignisse von PB auf unterschiedliche weise gemanagt.

Unter Linux und MacOS muss die Event-Schleife (WaitWindowEvent) durchlaufen werden, damit Änderungen der Gadgets auch durchgeführt werden.
Unter Windows gehen die meisten Änderungen direkt an das Gadget (Window Control) welches dieses dann verarbeitet.

Habe mal kleine Delay Funktion geschrieben welches auch die Event verarbeitet. Es werden dann aber alle auflaufende Event nicht an den eigenen Event-Loop weitergereicht, da es diese dann nicht mehr gibt.

Siehe DelayWithDoEvents()

Code: Alles auswählen

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_1
EndEnumeration

Enumeration FormGadget
  #Text_0
  #Button_0
EndEnumeration

Declare ResizeGadgetsWindow_1()

Declare Button_0(EventType)

Procedure OpenWindow_1(x = 0, y = 0, width = 250, height = 120)
  OpenWindow(#Window_1, x, y, width, height, "Compat", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(#Text_0, 10, 10, 230, 60, "", #PB_Text_Center)
  ButtonGadget(#Button_0, 70, 80, 115, 30, "Exiit")
EndProcedure

Procedure ResizeGadgetsWindow_1()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_1)
  FormWindowHeight = WindowHeight(#Window_1)
  ResizeGadget(#Text_0, 10, 10, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Button_0, 70, 80, FormWindowWidth - 135, FormWindowHeight - 90)
EndProcedure

Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadgetsWindow_1()
    Case #PB_Event_CloseWindow
      ProcedureReturn #False
      
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Button_0
          Button_0(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

Procedure DelayWithDoEvents(Time)
  Protected time_start
  time_start = ElapsedMilliseconds() 
  Repeat
    WaitWindowEvent(10)
  Until (ElapsedMilliseconds() - time_start) >= Time
EndProcedure

;XIncludeFile "window_1.pbf"
OpenWindow_1()

SetGadgetText(#Text_0,"Windows")
DelayWithDoEvents(2000)
SetGadgetText(#Text_0,"Linux")
DelayWithDoEvents(2000)
SetGadgetText(#Text_0,"MacOS")

Procedure button_0 (EventType)
  End   
EndProcedure

Repeat
  Event = WaitWindowEvent()
  
  Select EventWindow()
    Case MainWindow
      Window_1_Events(Event) 
      
      
  EndSelect
  
Until Event = #PB_Event_CloseWindow
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von #NULL »

Damit keine Events verschluckt werden, ohne in deiner Hauptschleife aufzutauchen, kannst du einen Timer verwenden.
timer() wird einmal manuell aufgerufen damit 'Windows' sofort erscheint und nicht erst nach 2 sekunden:

Code: Alles auswählen

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_1
EndEnumeration

Enumeration FormGadget
  #Text_0
  #Button_0
EndEnumeration

Declare ResizeGadgetsWindow_1()

Declare Button_0(EventType)

Procedure OpenWindow_1(x = 0, y = 0, width = 250, height = 120)
  OpenWindow(#Window_1, x, y, width, height, "Compat", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(#Text_0, 10, 10, 230, 60, "", #PB_Text_Center)
  ButtonGadget(#Button_0, 70, 80, 115, 30, "Exiit")
EndProcedure

Procedure ResizeGadgetsWindow_1()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_1)
  FormWindowHeight = WindowHeight(#Window_1)
  ResizeGadget(#Text_0, 10, 10, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Button_0, 70, 80, FormWindowWidth - 135, FormWindowHeight - 90)
EndProcedure

Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadgetsWindow_1()
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Button_0
          Button_0(EventType())         
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

;XIncludeFile "window_1.pbf"
OpenWindow_1()

Procedure timer()
  Static n
  n + 1
  Debug "timer " + n
  Select n
    Case 1
      SetGadgetText(#Text_0,"Windows")
    Case 2
      SetGadgetText(#Text_0,"Linux")
    Case 3
      SetGadgetText(#Text_0,"MacOS")
      
      Debug "remove timer"
      UnbindEvent(#PB_Event_Timer, @timer(), #Window_1, 123)
      RemoveWindowTimer(#Window_1, 123)
  EndSelect
EndProcedure
timer()
AddWindowTimer(#Window_1, 123, 2000)
BindEvent(#PB_Event_Timer, @timer(), #Window_1, 123)
   
Procedure button_0 (EventType)
  End   
EndProcedure
   
Repeat
  Event = WaitWindowEvent()
  
  Select EventWindow()
    Case MainWindow
      Window_1_Events(Event)
      
      
  EndSelect
  
Until Event = #PB_Event_CloseWindow 
my pb stuff..
Bild..jedenfalls war das mal so.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von ccode_new »

Hallo Jörg Burdorf,

so programmiert man doch auch so etwas nicht!

SetGadgetText(#Text_0,"Windows")
Delay(2000)
SetGadgetText(#Text_0,"Linux")
Delay(2000)
SetGadgetText(#Text_0,"MacOS")

Bitte programmiere nicht so! (Das interne Eventhandling wäre dankbar :wink: )

Besser:

Code: Alles auswählen

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Enumeration FormWindow
  #Window_1
EndEnumeration

Enumeration FormGadget
  #Text_0
  #Button_0
EndEnumeration

Declare ResizeGadgetsWindow_1()

Declare Button_0(EventType)

Procedure OpenWindow_1(x = 0, y = 0, width = 250, height = 120)
  OpenWindow(#Window_1, x, y, width, height, "Compat", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(#Text_0, 10, 10, 230, 60, "", #PB_Text_Center)
  ButtonGadget(#Button_0, 70, 80, 115, 30, "Exiit")
EndProcedure

Procedure ResizeGadgetsWindow_1()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_1)
  FormWindowHeight = WindowHeight(#Window_1)
  ResizeGadget(#Text_0, 10, 10, FormWindowWidth - 20, FormWindowHeight - 60)
  ResizeGadget(#Button_0, 70, 80, FormWindowWidth - 135, FormWindowHeight - 90)
EndProcedure

Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_Timer
      If EventTimer() = 123
        If GetGadgetText(#Text_0) = "Windows"
          SetGadgetText(#Text_0,"Linux")
        ElseIf GetGadgetText(#Text_0) = "Linux"
          SetGadgetText(#Text_0,"Mac")
          RemoveWindowTimer(#Window_1, 123)
        EndIf
      EndIf
    Case #PB_Event_SizeWindow
      ResizeGadgetsWindow_1()
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Button_0
          Button_0(EventType())         
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

;XIncludeFile "window_1.pbf"
OpenWindow_1()

AddWindowTimer(#Window_1, 123, 2000)

SetGadgetText(#Text_0,"Windows")
   
Procedure button_0 (EventType)
  End   
EndProcedure
   
Repeat
    Event = WaitWindowEvent()
 
    Select EventWindow()
      Case MainWindow
        Window_1_Events(Event)
     
       
    EndSelect
   
  Until Event = #PB_Event_CloseWindow 
#NULL war zuerst /:->
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von Jörg Burdorf »

Danke für die schnellen Antworten. Dachte mir schon, dass das Verhalten anders ist.

Wenn man also Plattform übergreifende Software schreiben will, muss man sich auf dem
kleinsten gemeinsamen Nenner treffen.

Hatte ich anders erwartet.

Nur mal so gefragt: Bei Linux habe ich auch das Problem, das der Aufbau eines Datenbankabfrage
Ergebnisses mit einem listicongadget je nach "Breite" und "Länge" extrem länger dauert als unter
Windows. Da Linux in einer VM läuft, habe ich das erst mal darauf geschoben. Habt ihr da Erfahrungen?

LG
Jörg
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von ccode_new »

Es ist auch unter Windows nicht gut das ganze Programm anzuhalten und das Eventhandling zu ärgern.

Einfache Datenbankabfragen (komplexe habe ich eh nicht!) dauern bei mir auch irgendwie etwas länger unter Linux.

Ich werde mich mal versuchen etwas weiter zu informieren.
Zuletzt geändert von ccode_new am 01.01.2019 23:19, insgesamt 1-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von Jörg Burdorf »

Hi.

Den delay hab ich nur als Beispiel benutzt.

Es geht eigentlich darum, den Status des Programmes während eines Datenbankzugriffes anzuzeigen,
quasi als Ersatz für die Eieruhr, also vor dem SQL gegen die Datenbank den Text auf "running...." zu setzen
und wenn Datenbank fertig wieder auf "" zu ändern. Wie gesagt funktioniert unter Windoofs aber nicht
unter den Unix Systemen.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von mk-soft »

Das mit der Datenbank kann verschiedene Ursachen haben.
Je nach Datenbank kann es je OS unterschiedlich mal dieses oder jenes mal schneller sein.
Sieht aber eher nach ein Event-problem aus.

Am besten die Datenbank-Funktionen in einen Thread auslagern.

Aber aufgepasst:
Linux und MacOS mögen es gar nicht wenn Gadget aus Threads geändert werden. Dieses führt definitiv zum Abstürzt des Programm oder zu eigenartigen verhalten.

Um Gadgets aus Threads zu ändern hat PB die Funktion PostEvent(...). mit dieser kann man Events an die Event-Schleife im Hauptprogramm senden.
Must aber nicht alles neu erfinden. Um gadgets aus Threads zu ändern habe ich das umfangreiche Modul "ThreadToGUI" zur Verfügung gestellt

Der Link zum Modul: viewtopic.php?f=8&t=29728

Must nicht auf eimal alles verstehen was dort passiert.
Im groben werden die Daten für das Gadget zusammen gepackt und mit PostEvent zum Hauptprogramm gesendet.
dann werden die Daten im Hauptprogramm entgegengenommen und zu dem Gadget weitergeleitet.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von ts-soft »

Jörg Burdorf hat geschrieben:Wie gesagt funktioniert unter Windoofs aber nicht
unter den Unix Systemen.
Alle Anzeigen sollten grundsätzlich einem Event folgen. Man sollte sich also niemals auf so ein Verhalten von Windows versteifen, weil es falsch ist und auch nicht besonders zuverlässig, je nach Windows-Version.

Um das richtig umzusetzen gibt es viele Möglichkeiten, zum Beispiel PostEvent().

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von ccode_new »

@Jörg Burdorf

Was für Datenbank-System verwendest du denn ?

Oftmals liegt es auch an der Art der Abfrage, oder eben an einem Eventhandling-Problem.

Unter Linux/Mac sind gleichzeitige (ohne "PostEvent") GUI-Eingriffe problematisch.
Zuletzt geändert von ccode_new am 01.01.2019 23:45, insgesamt 1-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten