Listicongadget langsam füllen

Anfängerfragen zum Programmieren mit PureBasic.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Listicongadget langsam füllen

Beitrag 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
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Du musst Windowevent() verwenden,
damit er das Fenster refreshed,
d.h. anzeigt was du gemacht hast.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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!
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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 ;)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag 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
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag 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,
Antworten