Thread und Error Behandlung

Hallo Leute,

ich habe 2 Probleme mit meinem Thread. Ich rufe den Thread über eine Pushbutton.Action auf

1.) Ich weiß dass ich keine UI Ausgabe im Thread machen darf. Was mache ich wenn ich mehrere Datenbankabfragen im Thread verarbeite wie z.b.

    If Not db.Error Then
      db.Commit
    Else
      db.Rollback
      MsgBox("Fehler beim Schreiben: "+sArtNum+" !")
      Return
    End If

und ein Fehler tritt auf , die MsgBox darf im Thread ja nicht ausgeführt werden.

2.) Was passiert wenn der Thread abgearbeitet ist, wie und wo kann ich danach noch Abschlussarbeiten (Progressbar auf den aktuellen Stand, Timer schließen) durchführen

Viele Grüße von einem Anfänger

Erstelle z.B. einen Timer (Modus Off und Period=0) in dem MsgBox(“Fehler beim Schreiben: “+sArtNum+” !”) ausgeführt wird. (sArtNum z.B. als Property des Fensters übergeben). Timer kann man aus Thfreads heraus starten und diese dürfen natürlich auf die UI zugreiffen.

Wenn Du schreibst “Timer schließen”, dann verwendest Du evtl. einen Timer um Daten die im Thread geholt wurden in Intervallen auszugeben?

Versuch es mal mit folgendem Ansatz (nur als Anregung zu verstehen):

  1. Thread holt x Daten
  2. Thread startet einen Timer
  3. Der Timer gibt die Daten aus und startet den Thread erneut, damit dieser die nächsten Daten holt

Im Timer kann man natürlich viel mehr machen als nur die Daten des Threads auszugeben.
Wenn der Thread keine weiteren Daten mehr bekommt (“fertig ist”), startet dieser nicht den Timer oder startet einen anderen Timer.

Nur so als Inspiration zu verstehen weil jeder neue Ansatz auch neue Herausforderungen mit sich bringen wird. :slight_smile:

Hallo Sasha,

vielen Dank für Deine rasche Antwort

In verschiedenen Foren/Blogs und Artikel habe ich verschiedene Vorgehensweisen
gelesen und auch schon ausprobiert. Leider funktioniert es nicht so wie ich es
gerne hätte.

Mit einem Pushbutton starte ich das Thread und den Timer

[code] // Timer einschalten
Timer1.Mode = Xojo.Core.Timer.Modes.Multiple

// Thread starten
Thread.Run
[/code]
Im Tread wird eine dBase Datei geöffnent und sequentiell gelesen und
bestimmte Datensätze in einer MariaDB upgedatet bzw. neu angelegt. Diese
Änderungen sollen in einer Listbox und ein Progressbar soll den Fortschritt
anzeigen.

Den Timer den ich gestartet habe soll die UI Anzeige steuern über Shared
Properties, die ich im Thread befülle.

Thread:

[code]…
While Not rs.eof

If db.Connect Then
db.SQLExecute(sql_Execute)
End If

If Not db.Error Then
db.Commit
Else
db.Rollback
// Fehlerausgabe
Return
End If

listbox.AddRow
listbox.Cell(listbox.LastIndex,0) = “XYZ”

//Shared Properties um eins erhöhren
iRS_Count = iRS_Count + 1

'App.YieldToNextThread

rs.MoveNext

Wend

App.YieldToNextThread
Timer1.Mode = Xojo.Core.Timer.Modes.Off
[/code]

Timer1:

[code]…
Progressbar.Value = iRS_Count

If iRS_Count > 0 Then
tZeile.Text = iRS_Count.ToText + " / " + iRS_Gesamt.ToText
tZeile.Visible = True
End If

tZeile.Refresh
Progressbar.Refresh
listbox.Redraw[/code]

So sieht im groben meine vorgehensweise aus. Wie bereits beschrieben,
habe ich das Problem mit der Fehlerbehandlung und dem Abschluss des
Threads.

@Sascha S
Erstelle z.B. einen Timer (Modus Off und Period=0) in dem MsgBox(“Fehler beim Schreiben: “+sArtNum+” !”)
ausgeführt wird. (sArtNum z.B. als Property des Fensters übergeben).

Wie könnte das aussehen, das sehe ich momentan nicht ?

@Sascha S
Versuch es mal mit folgendem Ansatz (nur als Anregung zu verstehen):

  1. Thread holt x Daten
  2. Thread startet einen Timer
  3. Der Timer gibt die Daten aus und startet den Thread erneut, damit dieser die nächsten Daten holt

Damit bekomme ich doch eine endlos Schleife mit immer wieder erneuten Aufruf des Threads oder habe ich da einen Gedankenfehler, und der Thread startet nicht neu sondern fährt dort fort an dem er aufgehört hat.

Eine von vielen Möglichkeiten, ist das hinzufügen von Properties zu einem Fenster. Z.B. Integer Namens LimitStart und LimitEnd. diese werden im Thread verändert und der Timer kann mit diesen weiter arbeiten. Oder Arrays in denen die Daten stehen die in einer ListBox gelistet werden sollen und der Timer nimmt immer das erste (0 Element), schreibt es in die Liste und entfernt dieses Element, sooft bis das Array leer ist. U.s.w. …

Nicht wenn Du an verschiedenen Stellen im Thread und/oder Timer, entsprechende Ausstiegsbedingungen (NIL Objekte, Fehler, Zähler, …) schreibst.

Der Thread würde immer wieder von vorne beginnen, ja. Aber wenn der Thread in der Datenbank da weiter macht wo er zuvor aufgehört hat und nicht alles in einem Durchgang erledigt, kann das die App reaktionsfreudiger machen in lang andauernden Threads.

Du könntest auch ein Property des Typs RecordSet an das Fenster hängen und den Timer die Daten daraus pullen lassen und den Thread erst dann wieder starten wenn Du am letzten Element des RecordSets angekommen bist und den Thread gar nicht mehr starten wenn das RecordSet = Nil ist.

Die Möglichkeiten solche Herausforderungen zu bewältigen sind wie so oft unendlich und nur Deine Kreativität setzt Dir Grenzen. :wink: