Aktuelle Zeit: 23.02.2019 13:03

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 22:15 
Offline

Registriert: 14.12.2018 23:01
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:
;
; 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 22:33 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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:
;
; 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 EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 22:40 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
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:
;
; 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 22:45 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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:
;
; 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 /:->


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 22:53 
Offline

Registriert: 14.12.2018 23:01
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 22:56 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 23:17 
Offline

Registriert: 14.12.2018 23:01
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 23:28 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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 EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 23:33 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
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.70 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.1 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verhalten des gleichen Source Codes auf Windows/Linux
BeitragVerfasst: 01.01.2019 23:37 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
@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.

Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye