Seite 2 von 5

Verfasst: 26.12.2007 02:08
von STARGÅTE
jo habe ich auch, in den Threads sind reine Berechnungen drinne wie z.B. Wegfindung.

Ich werde nun mal stück für stück ganze Codebereiche "abschalten", um so den Fehler einzugranzen ...

Verfasst: 26.12.2007 02:18
von PureLust
Ich brauchte auch erst 'ne ganze Weile bis ich in Punkto Threadsafe einigermaßen sattelfest war.
Schau mal bei Dir nach ... die meisten Probleme machen Linked-Lists und natürlich Strings.
Zugriffe auf solche Dinge musst Du mit Hilfe von "LockMutex()" kugelsicher machen.

Verfasst: 26.12.2007 02:24
von STARGÅTE
ja, habe ich alles, ich verwende dafür die WIN-API, da ich das in 3.3 auch tat und es ja in 3.3 damit super funtzte.

Ich habe jetzt wirklich alles "abgeschaltet" sodass nur noch das hier hatte:

Code: Alles auswählen

Repeat
 
 Delay(1)
 
 FlipBuffers()
 If IsScreenActive()

  ClearScreen(0)

 EndIf
 
ForEver
Alle Threads wurde nicht gestartet, und das da oben ist das einzige was läuft wenn ich Alt-Tabe, trotzdem stürzt das Programm ab.

Daraus schließe ich das alleine die "anwesenheit" von irgendwelchen Codestücken in der EXE diesen Absturz verursachen, was das jedoch ist weiß ich nicht -.-

Verfasst: 26.12.2007 02:57
von AND51
PureLust hat geschrieben:@AND51:
AND51 hat geschrieben:Du darfst nur zeichnen und flippen, solange der OpenScreen() den Fokus hat...
Genau das habe ich auch immer gedacht - und genau da lag mein Denkfehler.
Man darf nur ZEICHNEN wenn der Screen aktiv ist - FLIPPEN muss man jedoch IMMER.
Achso... Danke für die Info!

Aber wieso? Wenn ich Bock habe, kann ich doch nen Screen öffnen und erstmal ein paar Minuten lang irgendwelche Sprites laden, drehen, etc, ohne dass solange der Screen geflippt wird; dann stürzt das Programm doch auch nicht gleich ab, oder? Und ob ich eine Flip-Pause einlege und dabei Sprites zeichne, Dateien öffne/schreibe oder einfach Delay() mach, das ist doch egal.
Oder ist das immernoch ein Denkfehler? :?

Verfasst: 26.12.2007 03:13
von STARGÅTE
also, mal meine Ansicht:

der Debugger (sowohl 3.3 als auch 4.x) meckern beim wechsel zum Desktop an den Stellen:
Start/Stop Drawing/3D
Die Exe stürtzt auch nicht ab wenn du es trotzdem Compilierst und die Debugger raus lässt.

Aber hier ist halt das Problem das es irgendein Fehler DIRECKT beim Flippen gibt, denn auch wenn ich "nix" machen kackt das ding im SafeMode einfach ab, weil er irgendwo hinschreiben will wo er nicht darf. (vllt weil ThreadSafe irgend ein Bereicht schützt ...)

Ich habe selber auch nie IsScreenActive() benutzt und meine Spiele liefen trotzdem, (bis auf dem Grafik bug, was aber nichts mit dem hier zu tun hat)

Verfasst: 26.12.2007 10:44
von PureLust
@AND51:

Natürlich kannst Du diverse Dinge machen ohne dabei nun alle 1/60 Sekunde (oder so) einen FlipBuffer ausführen zu müssen.
Wie jedoch in den oberen beiden verlinkten Posts bereits beschrieben wird der Status von IsScreenActive() nur in einem FlipBuffers() aktualisiert.
Du MUSST also einen FlipBuffers() durchführen um den aktuellen Zustand des Screens heraus zu finden - Du darfst aber KEINESFALLS irgendwelche Ausgabebefehle ausführen wenn der Screen inaktiv ist.

Eine stabile Schleife sieht im Grunde so aus wie 3 Posts zuvor von STARGÅTE geschrieben.
Also erst ein FlipBuffers() und danach alle Befehle die irgendetwas mit der Ausgabe zu tun haben durch eine IsScreenActive()-Abfrage schützen.


@STARGÅTE:

Schau Dir evtl. nochmal mein Asteroids an und wechsle dort mit (f) in der FullScreen-Modus.
Im FullScreen-Modus muss ich mich dann halt auch mit IsScreenActive() herum schlagen und darum kümmern das bei inaktivem Screen keine Ausgabe mehr erfolgt.
Und da ich in Asteroids auch mit Threads arbeite ist es u.U. in etwa vergleichbar mit Deinem Projekt.
Aber wie Du dort sehen kannst läuft die Alt-Tab Umschaltung problemlos und stabil.

Wie gesagt ... ich hatte auch erst lange tüfteln müssen bis ich die richtige Anwendung von IsScreenActive() und natürlich auch von Threads verstanden haben.
Zuvor hatte ich auch erst alles auf PB, den Debugger oder die Threads geschoben.
Nachdem ich dann aber die Feinheiten begriffen hatte und diese nun beachte, läuft alles stabil.

Wenn Du's aber partu nicht hinbekommst kannst Du mir auch gerne mal ein Stück aus Deinem Code schicken an dem man das beschriebene Problem nachvollziehen kann - ich schau dann gerne mal rein.

Noch'n Tip zu den Befehlen Start/Stop Drawing/3D die bei Dir die Probleme machen:
Auch diese dürfen natürlich nur bei AKTIVEM Screen ausgeführt werden - müssen also innerhalb der IsScreenActive()-Bedingung erfolgen.

Gruß und FF,
PL.

Verfasst: 26.12.2007 12:08
von 7x7
Gratulation an STARGÅTE. Gehört das aber nicht eher in die 'Laberecke' als
in 'Ankündigungen' ?

Verfasst: 26.12.2007 12:29
von Kiffi
7x7 hat geschrieben:Gehört das aber nicht eher in die 'Laberecke' als
in 'Ankündigungen' ?
wenn STARGÅTE mit PB4.1 programmiert, dann ist das schon eine Ankündigung wert ;-)

Grüße ... Kiffi

Verfasst: 26.12.2007 13:04
von Vermilion
:bounce: Glückwunsch. Es klingt vielleicht doof, aber du warst immer die erste Assoziation wenn ich irgendwie an PureBasic 3.30 gedacht habe! :lol: Umgekehrt war es dann Dune, und danach erst PureBasic 3.30.

Verfasst: 26.12.2007 14:06
von STARGÅTE
3.3 ist für mich auch noch lange nicht gestorben.

3.3 werde ich für kleine sachen weiterhin verwenden, weil dort manche Befehle besser ware/sind.

@PureLust

ich werde weiter in meinem Code suchen.
In einem "normalen Code" läuft es ja mit IsScreenActive super, aber halt nur nicht bei dem speziellenm fall, aber ich habe ja n menge Zeit den Fehler zu suchen ^^