Programmfenster friert ein -> neues Problem

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

danibert

Betreff: Programmfenster friert ein -> neues Problem

BeitragDi, Jul 13, 2010 9:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich lese eine Datei aus und verarbeite den Inhalt, den Fortschritt zeige ich mit einer ProgressBar an. Wenn ich größere Dateien verarbeite und währendes Vorganges nichts mache, funktioniert alles problemlos. Klicke ich aber außerhalb des Programmfensters, oder versuche das Fenster herumzuschieben, bleibt die ProgressBar stehen. Teilweise wird auch der Fensterinhalt weiß. Wenn dieser Zustand etwas länger andauert, steht sogar in der Titelzeile meiner Anwendung "Keine Rückmeldung"
Das Programm arbeitet aber im Hintergrund ohne Probleme und aktualisiert das Fenster wieder, sobald die Datei verarbeitet wurde.
Wie bekomme ich das in den Griff?
BlitzMax: [AUSKLAPPEN]
Import maxgui.drivers
Strict

Local MyWindow:TGadget=CreateWindow("...", 40,40,400,400)
Local panel1:TGadget = CreatePanel(0, 0, 400,400, MyWindow) ; SetPanelColor panel1, 120,120,120

Global MyProgBar:TGadget=CreateProgBar(10,20,370,20,panel1)

dateilesen("J:\Testfile_500mb.test")

Function dateilesen:Int(path:String)

Local buffersize:Float = 64
Local bytesGesamt:Float = FileSize(path)
Local prozent:Float = 0
Local prozentTemp:Float = buffersize / (bytesGesamt / 100)
Local fileStream:TStream = OpenStream(path$, True, False)
Local buffer:Byte Ptr = MemAlloc(bufferSize)
Local str:String

Repeat
Local bytesRead:Int = fileStream.Read(buffer, bufferSize)
str = String.FromBytes(buffer, bufferSize)

'Weitere Verarbeitung von str
'...

UpdateProgBar MyProgBar, (prozent / 100)
prozent = prozentTemp + prozent

Until fileStream.Eof()

End Function
  • Zuletzt bearbeitet von danibert am Fr, Jul 16, 2010 16:41, insgesamt einmal bearbeitet

mpmxyz

BeitragDi, Jul 13, 2010 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte auch einmal so ein Problem gehabt.
Es liegt daran, dass dein Programm nicht mehr richtig mit Windows kommuniziert. (z.B. keine Events abfragt)
Genau dann kommt die "Keine Rückmeldung".
Wenn dir die während der Berechnung stattfindenen Events egal sind, nutze diesen Code:
BlitzMax: [AUSKLAPPEN]
If PeekEvent() Then WaitEvent()

(Die If-Abzweigung dient zur Verhinderung von langen Pausen in der Berechnung.)
Falls du auf die Events reagieren möchtest, musst du stattdessen den entsprechenden Code auch in der "Arbeitsschleife" ansprechen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

danibert

BeitragMi, Jul 14, 2010 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Abfrage von Events klappt das, danke für den Tipp.
Ein Problem habe ich noch:
Ich möchte eine Schaltfläche zum Abbrechen einbauen, bekomme aber jetzt einen Fehler: Unable to Convert from maxgui.maxgui.TGadget to Int

BlitzMax: [AUSKLAPPEN]
Import maxgui.drivers
Strict

Local MyWindow:TGadget=CreateWindow("...", 40,40,400,400)
Local panel1:TGadget = CreatePanel(0, 0, 400,400, MyWindow) ; SetPanelColor panel1, 120,120,120

Global MyProgBar:TGadget=CreateProgBar(10,20,370,20,panel1)
Global btn_Cancel:TGadget = CreateButton("Abbruch", 231, 328, 80, 22, panel1, BUTTON_CANCEL)

dateilesen("J:\Testfile_500mb.test")

Function dateilesen:Int(path:String)

Local buffersize:Float = 64
Local bytesGesamt:Float = FileSize(path)
Local prozent:Float = 0
Local prozentTemp:Float = buffersize / (bytesGesamt / 100)
Local fileStream:TStream = OpenStream(path$, True, False)
Local buffer:Byte Ptr = MemAlloc(bufferSize)
Local str:String

Repeat
Local bytesRead:Int = fileStream.Read(buffer, bufferSize)
str = String.FromBytes(buffer, bufferSize)

'Weitere Verarbeitung von str
'...

UpdateProgBar MyProgBar, (prozent / 100)
prozent = prozentTemp + prozent

'Einfrieren des Fensters verhindern
If PeekEvent()
WaitEvent()
Select EventID()
Case btn_Cancel; 'Abbrechen
End Select
EndIf

Until fileStream.Eof()

End Function

Bin echt ratlos...

Holzchopf

Meisterpacker

BeitragMi, Jul 14, 2010 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuchs so:

BlitzMax: [AUSKLAPPEN]
		'Einfrieren des Fensters verhindern
If PeekEvent()
WaitEvent()
If EventID() = EVENT_GADGETACTION
If EventSource() = btn_Cancel; 'Abbrechen
End If
EndIf


EventID() gibt nur einen Integer zurück, der die Art des Events kennzeichnet (welche Zahl das ist, interessiert uns kaum, wir müssen nur wissen, dass die Zahl, die beim Drücken eines Buttons von EventID() geliefert wird, von MaxGUI als Konstante EVENT_GADGETACTION definiert wurde), btn_Cancel hingegen ist vom Typ TGadget. Bei deinem If-Konstrukt versuchtest du also, ein Int mit einem TGadget zu vergleichen, daher der Fehler.

Um zu prüfen, von welchem Gadget das Event ausgelöst wurde, nimmt man EventSource().

mfG
Holzchopf
 

danibert

BeitragFr, Jul 16, 2010 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
...und noch ein Problem ist aufgetaucht:
wenn ich nun versuche, Dateien größer als 1GB einzulesen, bekomme ich keinen Ladebalken mehr und das Programm läuft anscheinend in einer endlosen Schleife.
Ich dachte zuerst, es liegt an meinen Float Variablen und habe diese alle gegen Double ausgetauscht - leider ohne Erfolg.
Woran kann das liegen?

mpmxyz

BeitragFr, Jul 16, 2010 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist die Datei zufälligerweise 2 GiB groß?
Dann kommt es zu einem Ganzzahlüberlauf bei dem zurückgegebenen Integer der Funktion "FileSize".
(Aus 2 GiB werden dann -2 GiB.)
Falls es nicht daran liegt, solltest du mal mit den Debug-Funktionen schauen, was das Programm wirklich macht.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group