Programmabsturz / Crash bei OpenWindowedScreen in procedure

Anfängerfragen zum Programmieren mit PureBasic.
Onetime
Beiträge: 20
Registriert: 15.05.2018 20:02

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Beitrag 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....
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Beitrag 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 :) .
Bild
Onetime
Beiträge: 20
Registriert: 15.05.2018 20:02

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Beitrag 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.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Beitrag 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
Bild
Onetime
Beiträge: 20
Registriert: 15.05.2018 20:02

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Beitrag 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...
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Programmabsturz / Crash bei OpenWindowedScreen in proced

Beitrag 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. ;)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

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