Seite 1 von 2

Listicongadget langsam füllen

Verfasst: 27.12.2005 20:21
von ullmann
Hallo,

hier ein Auszug aus meiner Programmstruktur:

Code: Alles auswählen

deftype.b grafik ;<>0 wenn Visualisierung gewünscht
deftype.l loesung  ;zähler aller Lösungen
deftype.l anzsuche ;zähler aller Suchvorgänge

procedure addloesung ()
  shared loesung
  ... ;erweitert mit addelement die Liste der Lösungen und trägt die Lösung ein
  loesung=loesung+1
  ... ;füllt mit addgadgetitem und setgadgetitemtext ein mehrspaltiges Listicongadget mit einem weiteren Wert (eben dieser Lösung)
endprocedure

procedure suche ()
  ;sucht rekursiv (max. 9 Ebenen) und mit zigtausend Schleifendurchläufen die nächste Lösung
  shared anzsuche
  shared grafik ;<>0, wenn Visualisierung der Suche gewünscht
  if (Lösung gefunden)
    addloesung()
  else
    for ... to ...
      ;nächste Variante
      anzsuche=anzsuche+1
      if grafik ;wenn Visualisierung gewünscht
        delay(5) ;wird später noch programmiert
      endif
      if (Rekursionsbedingung erfüllt)
        suche() ;Rekursion, max. 9 Ebenen
      endif
    next
  endif
endprocedure

procedure rechnung ()
  shared anzsuche, loesung
  deftype.s statistik ;lokale Variable
  ...;Vorbereitungen: Fenster löschen, Liste der Lösungen leeren, Startzeit ermitteln
  anzsuche=0
  loesung=0
  textgadget(...,statistik)
  listicongadget(...) erstellen und mehrere Spalten darin einrichten
  suche()
  statistik=(anzsuche und loesung in Text gewandelt)
  setgadgettext(...,statistik)
  ...;Abfrageschleife Zurück und Weiter-Button, Fenster geschlossen
endprocedure

...;Vorbereitungen im Hauptprogramm
...;Schleife mit Auswahl des Programmteiles (z.B. rechnung()) oder End-Bedingung
end

In zwei Punkten verstehe ich PureBasic nicht:

1. Ist Grafik=0 findet das Programm alle Lösungen in < 1 ms und füllt das Listicongadget korrekt.
Ist Grafik=1 dauert die Suche ca. 1 min 30 s (für die Visualisierung möchte ich die Rechenzeit variabel gestalten und auf einem imagegadget anzeigen) und ich hoffte, das listicongadget füllt sich langsam. Obwohl jede Lösung sofort in das listicongadget eingetragen wird, bleibt das Fenster die gesamte Rechenzeit grau und erst nach den 1 1/2 min wird das listicongadget korrekt angezeigt. So möchte ich das nicht haben.

2. Eigentlich reicht es aus, wenn anzsuche und loesung lokal in rechnung() definiert werden (habe ich dort auch mit deftype versucht), dann ist aber die Anzeige der Variable Statistik mit Nullen gefüllt. Warum?

Danke für Antworten.

Rainer

Verfasst: 27.12.2005 20:25
von Macros
Du musst Windowevent() verwenden,
damit er das Fenster refreshed,
d.h. anzeigt was du gemacht hast.

Verfasst: 27.12.2005 20:30
von ts-soft
Wenn die Windows-Ereignisse nicht abgearbeitet werden, wird auch nicht Neugezeichnet. Da Threads zur Zeit nicht allzu sicher sind, solltest Du einfach ein paar:

Code: Alles auswählen

While WindowEvent() : Wend
an geeigneter Stelle einfügen. Die Rechnung mit Grafik endhält ja ein Delay, das die ganze Programmausführung anhält, das solltest Du auch entfernen.

Verfasst: 27.12.2005 20:34
von freedimension
ts-soft hat geschrieben:Wenn die Windows-Ereignisse nicht abgearbeitet werden, wird auch nicht Neugezeichnet. Da Threads zur Zeit nicht allzu sicher sind, solltest Du einfach ein paar:

Code: Alles auswählen

While WindowEvent() : Wend
an geeigneter Stelle einfügen. Die Rechnung mit Grafik endhält ja ein Delay, das die ganze Programmausführung anhält, das solltest Du auch entfernen.
Aber Vorsicht! "Geeignete Stelle" solltest du wirklich wörtlich nehmen, ansonsten riskiert du verlorengegangene Events und darfst dich dann z.B. nicht darüber wundern warum du x-Mal auf einen Button drücken musst bevor der dazugehörige Code ausgeführt wird. Den Kniff also mit Bedacht verwenden!

Verfasst: 27.12.2005 20:40
von ts-soft
Die MainLoop wird doch sowieso dann nicht abgearbeitet, man sollte am
besten die Gadgets solange Disablen und ne fleissige Biene oder was
ähnliches als Mauscursor bereitstellen :wink:

Verfasst: 27.12.2005 20:44
von freedimension
Das war ja jetzt auch nichts gegen deinen Tipp, aber aus Erfahrung weiß ich, dass Anfänger so etwas gerne auch einmal an anderen Stellen einsetzen wo es eben nicht mehr ohne Nebenwirkungen bleibt ;)

Verfasst: 27.12.2005 20:52
von ullmann
Ich habe While: Windowevent(): Wend in addloesung() ziemlich am Ende eingefügt, klappt einwandfrei. Danke für die Hinweise.

Bei der Visualisierung soll der Nutzer den verschiedenen Stellungen von 8 gleichen Figuren auf einem Schachbrett folgen können, dass Programm wollte ich mit delay(x) verlangsamen, wobei x=1000/Stellungen pro Sekunde ist (wenn auch nicht ganz genau, aber ungefähr reicht es mir aus. Wenn delay(x) nicht gut ist, wie verlangsame ich dann das Programm ? (API-Aufrufe, z.B. settimer_(...) möchte ich generell nicht verwenden).

Rainer

Verfasst: 27.12.2005 20:58
von ts-soft
Verlangsamen kannste mit Delay, ich dachte nur, weil Du geschrieben hattest, mit Grafik braucht er so lange :wink:
Am besten vor dem Delay auch mit While WindowEvent() : Wend aktualisieren. Die Gadgets solange zu Disablen wäre auch besser, damit man gar keine Buttons o. ä. betätigen kann.

Verfasst: 27.12.2005 21:05
von ullmann
Danke.

Weiß jemand auch eine Antwort auf meine zweite Frage? Ich vermute, weil der Compiler nur einen Übersetzungslauf macht, kennt er die Variablen nicht rechtzeitig.

Rainer

Verfasst: 27.12.2005 22:03
von Konne
Also das mit deftyp musst du nicht so machen, ein einfaches .s recht schon. Sowas ist nur bei vielen Variablen nützlich. Das mit dem Debuggen hab ich net richtig verstanden was du da meinst,