Seite 2 von 2

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Verfasst: 26.11.2018 12:56
von Onetime
PS: Ich habe das jetzt im meiner Anwendung mal geändert. Funktioniert im Prinzip.

Nachteile im Moment:
Ich muss jetzt am Anfang des Programms schon festlegen wie groß mein Screen werden soll. später kann ich weder eine Resize machen noch einen neuen Screen mit anderer Grösse erzeugen, da das ja anscheinend -ohne Absturz nicht geht.
Das schränkt ein....

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Verfasst: 26.11.2018 21:26
von DarkSoul
Was hast du genau vor?

Soll das ein Spiel werden?
Optionscreen, wo man alles mögliche einstellen kann und dann das Spiel starten kann, so dass erst dann der Grafikscreen öffnet?

Teile es doch auf zwei Binaries auf, so dass quasi zwei unabhängige Prozesse entstehen.
Die erste ist der Optionscreen, die dann die zweite mit entsprechenden Parametern startet. Hätte auch Vorteile, dass du dich nicht bei jedem Testlauf auf's neue durch die Optionen klicken musst :) .

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Verfasst: 29.11.2018 16:19
von Onetime
Nein, kein Spiel.

Ich habe eine Anwendung die Kurvenverläufe berechnet und dann als Kurvengrafik anzeigt.

Zusätzlich -über Button- biete ich dann noch an aus der Kurve, durch Drehung, eine 3D Figur anzuzeigen damit mein eine räumliche Vorstellung bekommt...

Man kann sich das dann schön hin- und herdrehen und von vorn und hinten anschauen … so die Idee.

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Verfasst: 05.12.2018 03:31
von DarkSoul
Achso.

Ist prinzipiell nicht anderes als ein Spiel mit vorgeschaltetem Launcher. :)

Könntest daher trotzdem auf zwei ausführbare Dateien (einmal "Launcher" mit der ganzen Mathematik usw und einmal die 3D-Ausgabe) aufteilen, um das Problem zu umschiffen.

Kannst diese zwei natürlich wieder vereinen.

Dann wird die Engine als zweiter Prozess gestartet.

Wie du die Ausgabedaten rüberbekommst... suche dir was aus:
- Daten als Parameter mitgeben, wenn es nicht zu viele sind
- Temporäre Datei und Pfad zu dieser als Übergabeparameter (diese Variante habe ich für das nachfolgende Beispiel genommen)
- Direkte Kommunikation über stdin/stdout (Ich weiß nicht 100%ig, ob Windows da mitspielt, da dieses AFAIK zwischen Konsolen- und Nicht-Konsolen-Anwendung unterscheidet)
- Network-Library (Echtzeitkommunikation, bei der Server und Client auf demselben Host laufen, also nicht wirklich Netzwerk). Musst dir halt eine Schnittstelle bauen. Mit PB relativ einfach. :)

Beispiel (primitiv, ohne Fehlerhandling):

Code: Alles auswählen


Procedure Run3DView()
  ;In echt kommt hier das Ogre-Gedöns rein
  tmpFile$ = ProgramParameter()
  If tmpFile$
    file = ReadFile(#PB_Any,tmpfile$)
    If file
      text$ = ReadString(file)
      CloseFile(file)
      If text$ ;obacht! Die Daten vor Verwendung auf Korrektheit prüfen. Sonst evtl. Sicherheitslücke!
        MessageRequester("Bla","Die Texteingabe ist: "+text$,0)  
      EndIf    
    EndIf
  EndIf
EndProcedure
Procedure runLauncher()
  mainWin = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,512,384,"Launcher",#PB_Window_ScreenCentered)
  textbox = StringGadget(#PB_Any,8,8,256,20,"")
  button = ButtonGadget(#PB_Any,256+8,8,20,20,"Fire!")
  Repeat
    event = WaitWindowEvent()
    If event = #PB_Event_Gadget
      If EventGadget() = button
        text$ = GetGadgetText(textbox)        
        If text$
          tmpPath$ = GetTemporaryDirectory()
          If tmpPath$
            tmpFile$ = tmpPath$ + "purebasic_ogre_bla.dat"  ;Vorsicht! Nicht mit den Tempdateien anderer Programmen kollidieren! In Echt einen eigenen Unterordner verwenden und noch einen Hashwert mit rein (damit mehrere Instanzen möglich sind)!
            file = OpenFile(#PB_Any,tmpFile$)
            WriteString(file,text$)
            CloseFile(file)
           ;Datei wieder löschen nicht vergessen! (mache ich jetzt nicht^^. Der zweite Prozess muss irgendwie an den ersten zurückmelden, dass er die Datei ausgelesen hat und dann weg damit. Oder dem zweiten Prozess die Löschung überlassen)
            If file
              RunProgram(ProgramFilename(), "-view " + tmpFile$,GetCurrentDirectory()) ;Die 3D-Ausgabe starten
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf    
  Until event = #PB_Event_CloseWindow
EndProcedure
If ProgramParameter() = "-view"
  Run3DView()
Else
  RunLauncher()
EndIf
End

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Verfasst: 09.12.2018 14:36
von Onetime
… oder man müsste mal probieren was passiert wenn man den 3D Kram in einen eignen Thread auslagert... in der Hoffnung das das Programm dann nicht abstürzt wenn man den Thread mehrmals nacheinander startet.. mal sehen.
Das mit der Datenübergabe muss dann natürlich auch bedacht werden.
Danke für die Tipps...

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Verfasst: 09.12.2018 15:37
von ccode_new
der man müsste mal probieren was passiert wenn man den 3D Kram in einen eignen Thread auslagert... in der Hoffnung das das Programm dann nicht abstürzt wenn man den Thread mehrmals nacheinander startet.. mal sehen.
Das wäre fatal falsch!

Das stürzt dann mit eigentlich 100% Sicherheit ab. ;)