Berechnungen im Hintergrund

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

GrrBrr

Betreff: Berechnungen im Hintergrund

BeitragMi, Jun 28, 2006 1:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe ein kleines Problemchen. Ich stelle in meinem Programm einige langwierige Berechnungen an, die Teils mehrere Minuten dauern. Jetzt möchte ich aber in der Zeit in meine Hauptschleife und Maus, GUI und eventuell eine Fortschrittsleiste updaten, damit das ganze nicht komisch aussieht.

Ich hatte auch schon einige Ideen, dass ich zb in jedem for-Durchlauf der Berechnungen, meine Updates und mein Flip per Funktion ausführe, aber das ist ziemlich ... ich sage mal... unschön.

Kennt jemand eine elegantere Lösung, wie man das macht?


Gruss
GrrBrr
3D - GFX - Wallpaper - PixelArt - Galerie
>>> http://www.augensound.de <<<
 

Dreamora

BeitragMi, Jun 28, 2006 8:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt keine wirklich elegantere Lösung.

BlitzMax unterstützt kein Multithreading (Module die das dennoch anbieten garantieren dir nur den Crash von BlitzMax auf Systemen mit mehr als einem Core)

Das einzige was du machen könntest, ist deine Berechnung in kleinere "Probleme" aufzuteilen und jeweils Problem um Problem zu berechnen und dazwischen sonstwas tun.

Allerdings sehe ich das Problem leider nicht ganz, dass man warten muss. Wer solche Berechnungen machen möchte, erwartet, dass das Programm das möglichst effizient tut ... (rendering, syntethic texture generation etc)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Skulk

BeitragMi, Jun 28, 2006 9:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Enthält deine Berechnung Schleifen? Ich vermute mal so, oder?

Wenn ja dann kannst du folgendes tun:
Zähle eine weitere Variable hoch (ich nenne sie mal iCounter)
Wenn iCounter eine gewisse grenze überschritten hat (z.B. 25) dann rufe eine Unterfunktion auf.
diese Unterfunktion macht nichts weiteres als entweder den Fortschrittsbalken "weiter zu schubsen" oder eben eine Nachricht ausgeben: "alles ok, ich lebe noch"

Warum nur alle 25 durchgänge? Ganz einfach. würdest du das jeden Durchgang machen, verzögerst du deine Berechnungen unnötig. Wenn du allerdings nur alle paar "meilensteine" etwas ausgibst, fällt das fast nicht auf, und der user weiss dass sich dein Programm nicht aufgehangen hat udn dass er noch etwas geduld benötigt.

Tipp: Als dezentes "Lebenszeichen" würde ich eine Simple Grafik nehmen, die in einem der 4 ecken oder der bildschirm mitte lediglich um 45° (oder 90°) rotiert.
So musst du keine Zeit-Schätzungen einbauen und der User stört sich nicht drann, dass eventuell nur unregelmäßige "Fortschritte" zu erkennen sind. (zumindest ist das meine Subjektive meinung dazu)
War doesn't determine who's right,
war determines who's left...
 

GrrBrr

BeitragMi, Jun 28, 2006 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Tips. Hatte eine ähnliche Idee auch schon, ist natürlich nicht optimal, aber was soll man machen... Confused Smile
3D - GFX - Wallpaper - PixelArt - Galerie
>>> http://www.augensound.de <<<
 

Skulk

BeitragMi, Jun 28, 2006 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du natürlich auch machen kannst,

ist "ganz normal" weiter arbeiten als würdest du nichts berechnen.
während dessen rufst du aber eine sub-funktion auf, die lauter kleine teilschritte deiner berechnung unternimmt und eine variable immer den Schritt speichert, in dem du dich befindest.

aber wenn sich deine berechnungen nicht feingranular aufsplitten lassen, wirst du damit auch keine freude haben...

ach noch eine alternative:
schreibe für die berechnung ein 2tes programm (vorzugsweise vielleicht sogar in einer anderen programmiersprache) und rufe dieses asynchron auf.

da ich leider eine lange BB pause hinter mir hab, weiss ich nicht auswendig ob BB Asynchrones aufrufen unterstützt, oder immer auf beendigung wartet. Allerdings liesse sich dies auch mit anderen Programmiersprachen umgehen.

sehr dreckig, aber du wolltest anreize *gg*
War doesn't determine who's right,
war determines who's left...
 

Dreamora

BeitragMi, Jun 28, 2006 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das wäre möglich, mittels CreateProcess
Damit kann man BlitzMax weiterlaufen lassen, während das andere Programm läuft.
Allerdings kann dann die Berechnung nur anhand von daten in einer Datei erfolgen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

DivineDominion

BeitragMi, Jun 28, 2006 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Könnte man dann nicht auch einfach das zweite Programm asynchron laufen lassen, dort alle Ergebnisse (wenn es nur Berechnungen sind) irgendwie in Banks buffern und im ursprünglichen Programm wieder rausholen? Habe so meine Zweifel, ob das was bringt, aber immerhin ist RAM ja schneller als HDD, wenn du von da deine Daten holst und verarbeitest und im RAM lagerst. Nur so eine Idee... Müsste natürlich der Garbage Collector idealerweise ausschaltbar sein Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

Dreamora

BeitragMi, Jun 28, 2006 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich wäre es schneller ja.
über malloc kannst du non-GC ram allozieren, wäre damit also kein GC problem.

Allerdings ist es mir nicht gelungen, den Pointer von einer App zur anderen zu bekommen, Process.Pipe.Readline etc gab nix aus, egal was ich in die Konsole schrieb. (wollte mir so einen asyncronen Datenladerschreiben)
Aber vielleicht war das ja auch einfach der falsche Ansatz oder ich habe einen Fehler gemacht. Wäre auf jeden Fall die sinnvollere Variante als HD Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

GrrBrr

BeitragDo, Jun 29, 2006 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessante Idee, habe allerdings keine Erfahrung mit Speicherrumgeschiebe etc. deswegen lasse ich lieber erstmal die Finger davon. Über HD scheint mir unelegant, die Ideen an sich ist aber gut.

Ich werde einfach mal versuchen meine Berechnungen zu splitten und bei Gelegenheit im Hintergrund weiterzuführen. Und wenn das nicht klappt, dann sollen die User halt warten. Schade, im Hintergrund würde mir aber besser gefallen...

Danke für die zahlreichen Ideen. Vielleicht hat ja jemand noch eine? Ist so oder so ein interessantes Thema, find ich.
3D - GFX - Wallpaper - PixelArt - Galerie
>>> http://www.augensound.de <<<

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group