Seite 3 von 3
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 13:09
von Paddy1988
Aber wie könnte ich das hängen des Programms sonst umgehen?
In der Zeit sagen wir mal 3 Minuten so lange dauert die Datenbankabfrage wird vom User keine Eingabe gemacht und das Fenster wird auf Disable gesetzt, es soll also nicht angeklickt werden können.
In dieser Zeit wo die Datenbankabfrage läuft soll sich das Programm nicht aufhängen und wenn die Abfrage durch ist soll das Programm wieder bedienbar sein.
Muss doch möglich sein
Habt ihr noch eine Idee wie man es besser oder anders machen kann oder einen TIP um das aufhängen zu umgehen?
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 13:12
von mhs
Da musst du etwas umdenken, denn deine EventQueue muss regelmäßig mit WaitWindowEvent() abgearbeitet werden, wie Nic schon sagte. Werden die Events nicht abgeholt "hängt" dein Programm quasi.
Ein einfacher Programmablauf könnte so aussehen:
- Verzeichnisse einlesen und Daten in eine Liste schreiben
- Thread erstellen
- Thread holt ein Element aus der Liste und arbeitet es ab
... solange bis die Queue leer ist
Der WaitWindowEvent() - Repeat Loop läuft immer parallel ohne angehalten (also kein WaitThread) zu werden.
Die Lösung mit der ConcurrentQueue von Nic ist die fortgeschrittene Variante davon, solltest du dir unbedingt ansehen.
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 13:17
von NicTheQuick
Wenn das Fenster sowieso deaktiviert ist, dann kannst du es auch wie folgt lösen.
Statt
Code: Alles auswählen
If IsThread(Thread)
Debug "Thread: "+Thread
WaitThread(Thread)
EndIf
...schreibst du
Code: Alles auswählen
While IsThread(Thread)
While WaitWindowEvent(100) : Wend
Wend
Dann werden die Fensterevents abgearbeitet, aber nicht ausgewertet, bis der Thread zu Ende ist. Dann bekommst du auch keine Meldung à la "Keine Rückmeldung".
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 13:32
von Paddy1988
Dankeeee NicTheQuick
Das hat gerade super funktioniert, muss nochmal genau testen aber scheint so als passt es.
Also vielen vielen Dank
Aber was mich doch interessiert, ich hatte das eigentlich genau so schon in meinem Programm wie du geschrieben hast, nur hatte ich kein Timeout angegeben. Da hat er die Threads durcheinander geworfen

.
...schreibst du
Code: Alles auswählen
While IsThread(Thread)
While WaitWindowEvent(100) : Wend
Wend
...ich hatte es so
Code: Alles auswählen
While IsThread(Thread)
While WaitWindowEvent() : Wend
Wend
Wo ist da genau der Unterschied, also warum ist das Timeout notwendig. Und welche Zeit in Millisekunden?
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 14:07
von NicTheQuick
Das steht eigentlich gut beschrieben in der Hilfe zu 'WaitWindowEvent()'. Ohne Timeout bleibt der Programmablauf so lange bei 'WaitWindowEvent()' stehen, bis du die Maus bewegst, oder klickst oder sonstwas passiert. Mit dem Timeout wird die Funktion alle x Millisekunden verlassen, egal, ob etwas passiert ist oder nicht. Ich hab 100 ms gewählt, weil das nicht zu lange und nicht zu kurz wartet.
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 15:49
von mhs
NicTheQuick hat geschrieben:
Code: Alles auswählen
While IsThread(Thread)
While WaitWindowEvent(100) : Wend
Wend
Top

genial einfach
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 16:09
von HeX0R
mhs hat geschrieben:Top

genial einfach
Nicht wirklich, genaugenommen ist es immernoch Murks

Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 16:28
von NicTheQuick
HeX0R hat geschrieben:mhs hat geschrieben:Top

genial einfach
Nicht wirklich, genaugenommen ist es immernoch Murks

Genau. Ein Thread ist dafür immer noch überflüssig.
Ich würde den gesamten Scanvorgang des Verzeichnisses in einen Thread packen. Oder wie schon erwähnt mit einem Threadpool arbeiten. Solange der Thread läuft, darf man den Vorgang eben nicht erneut starten. Da muss man dann nur den Button deaktivieren und nicht gleich das ganze Fenster.
Aber hier im Anfänger-Forum ist dies die einfachste Variante.
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 13.07.2016 17:00
von mhs
HeX0R hat geschrieben:mhs hat geschrieben:Top

genial einfach
Nicht wirklich, genaugenommen ist es immernoch Murks

Genaugenommen schon, einem "Anfänger" damit aber einfach, schnell und zielgerichtet zu helfen finde ich trotzdem gut.
Re: Thread erstellt und dennoch ungültiger Speicherzugriff
Verfasst: 14.07.2016 07:57
von Paddy1988
Genau, für mich ist die Lösung erst einmal super funktional, auch wenn es bestimmt besser geht mit einem Thread Pool wie ihr vorgeschlagen habt. Evtl baue ich die Funktion auch noch ein, aber so passt es erst einmal.
Ich bedanke mich sehr für eure gute Hilfe und die guten Anregungen.
