Thread erstellt und dennoch ungültiger Speicherzugriff

Anfängerfragen zum Programmieren mit PureBasic.
Paddy1988
Beiträge: 19
Registriert: 28.12.2015 15:31

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag 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 :roll:
Habt ihr noch eine Idee wie man es besser oder anders machen kann oder einen TIP um das aufhängen zu umgehen?
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag 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".
Paddy1988
Beiträge: 19
Registriert: 28.12.2015 15:31

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag 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.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag von mhs »

NicTheQuick hat geschrieben:

Code: Alles auswählen

While IsThread(Thread)
	While WaitWindowEvent(100) : Wend
Wend
Top :allright: genial einfach
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag von HeX0R »

mhs hat geschrieben:Top :allright: genial einfach
Nicht wirklich, genaugenommen ist es immernoch Murks ;)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag von NicTheQuick »

HeX0R hat geschrieben:
mhs hat geschrieben:Top :allright: 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.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag von mhs »

HeX0R hat geschrieben:
mhs hat geschrieben:Top :allright: 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Paddy1988
Beiträge: 19
Registriert: 28.12.2015 15:31

Re: Thread erstellt und dennoch ungültiger Speicherzugriff

Beitrag 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. :allright:
Antworten