Nach einfügen eines 2ten Thread merkwürdige Fehler
-
Aloa Forum
Ich habe ein Programm geschrieben welches aus dem Main Thread, zum einlesen von 2 Textdateien jeweils einen Thread startet.
Die Methoden zum einlesen und danach schreiben in eine gemeinsame Access DB waren schon fertig. Haben auch alle wunderbar funktioniert.
Nachdem ich dann die neue Oberfläche fertig gestellt habe, habe ich einen ersten Borland Thread für die erste Einlese Funktion hinzugefügt. Alle entsprechnenden Methoden sind in diese cpp und h datei eingefügt worden.
Und alles hat wunderbar funktioniert. Es traten keine Fehler auf... also überhaupt gar keine......Dann habe ich vorhin den zweiten Borland Thread hinzugefügt. Da das ganze ja nach dem selben Schema wie vorher lief, habe ich die andern Mehtoden in die cpp und h datei gefügt usw.
Immer noch hat alles geklappt. Hab dann nen paar mal nur die zweite Funktion getestet ... alles hat funktioniert.Dann hab ich wieder die erste Funktion per Button gestartet ... und WUSHH direkt nen Fehler und Programm absturz. Total verwirrt nochmal compiliert und nochma versucht... wieder selber fehler. Neu compiliert und zweite methode gestartet ... scheint zu laufen ... doch am ende auch nen fehler.
Nach einigem untersuchen is mir dann aufgefallen das der auf einmal die Methoden die in den Threads aus der Execute Methode gestartet werden, gleichzeitig ausführt, wodurch natürlich diverse Zugriffsverletzungen entstehen.
1. Warum ???
2. Warum is das erst jez passiert ?? (Hab an sich nix mehr geändert)
3. Liegt es am zweiten Thread ??????Hoffe ihr habt nen bischen mehr Erfahrungen mit Threads als ich

mfg Blade
-
Was heißt 'natürlich' Zugriffsverletzungen entstehen?
Threads verwendet man doch um verschiedene Aufgaben gleichzeitig ausführen zu können. Hast Du Deinen Code auch threadsicher gestaltet (Synchronize, TCriticalSection)?
Hast Du dir mal durchgelesen was in der BCB-Hilfe bezüglich multithreaded Datenbankanwendugen steht? Wenn ich mich richtig erinnere, muß man für jeden Thread eine eigene TSession anlegen.
-
Hab erst vorgestern mit Threads angefangen, hab mir dazu hier nen Tutorial durchgelesen. Da stand wie das in etwa geht und die Grundlagen und das man bei WinApi Threads dies und das zum Thema Threadsicherheit beachten muss ... um das aber alles nicht machen zu müssen könnte man auch die Borland Threads nehmen.
So habe ich das dann auch gemacht ... nen neues Projekt und dann einen Borland Thread eingefügt. Hat alles geklappt. Hab von dem Thread aus auf Komponenten zugreifen können und das hat alles wunderbar aktualisiert etc.
Damit dachte ich wäre dann die Funktionalität an diesem Beispiel getestet. Hab dann mein Projekt neu gebaut. Und neben dem Formular, 2 Threads eingebunden, wobei der eine Daten aus Excel einliesst und in eine Access DB schreibt und der andere Daten aus einer textdatei und in Access schreibt.
Hab also erst den ersten Thread genommen ... und alles hat geklappt. Da gabs keine Zugriffsverletzungen. In der Methode die den Thread startet wird als
1.0 der thread gestartet
1.1 in dem thread die einlesen methode gestartet
1.2 danach in dem thread die schreiben methode gestartet
2.0 die datenbankinfos neu eingelesen
3.0 eine showmessage "fertig" ausgegeben.Das hat der alles hintereinander!!! abgearbeitet....
nach einfügen des 2.ten Threads aber hat der dann probiert alles gleichzeitig zu machen. Das einlesen wurde gestartet, jedoch nichts eingelesen, gleichzeitig schon das schreiben gestartet, und da nichts eingelesen war direkt wieder beendet. gleichzeitig kam jedoch der aufruf die datenbank infos neu einzulesen, wodurch sich die zugriffe bei der adoconnection geschrottet haben.Warum kam dies alles jedoch erst nach einfügen des 2ten Threads??? Hab jez mal probiert den einfach wieder zu entfernen und hab alle verweise und sowas gelöscht. Aber der Fehler tritt immer noch auf.

-
Du greifst aus deinem Thread auf VCL Kompos zu?
-
Unter anderem ... und auf ADO Objekte usw.
Solange es nur ein Thread war hat geklappt.
-
äh ... was im Source der neu erstellten Threadobjekte Steht hast du aber gelesen, oder? (bzgl. Synchronize etc..)
-
Auf die Gefahr hin, mich zu wiederholen:
Joe_M. schrieb:
Was heißt 'natürlich' Zugriffsverletzungen entstehen?
Threads verwendet man doch um verschiedene Aufgaben gleichzeitig ausführen zu können. Hast Du Deinen Code auch threadsicher gestaltet (Synchronize, TCriticalSection)?
Hast Du dir mal durchgelesen was in der BCB-Hilfe bezüglich multithreaded Datenbankanwendugen steht? Wenn ich mich richtig erinnere, muß man für jeden Thread eine eigene TSession anlegen.
-
Ja, das mit dem Synchronize hab ich gelesen...
warum hat das vorher denn funktioniert ? Ich hatte das einlesen und das schreiben nach access komplett in eigenen methoden, und diese haben nur eine Synchronize methode zum aktualisieren der ProgressBar aufgerufen.
Das hat dann solange nach dem prinzip geklappt bis ich das zweite thread objekt eingefügt habe.Weils gerade trotz nur eines Threads immer noch fehler hatte, hab ich wie du meintest einfach mal die ganze methode, also einlesen und schreiben als synchronize aufrufen lassen ........ jez funktionierts ... nur is der vorteil der threads jez weg und das programm bleibt hängen solange.
@Joe_N hatte keine eigene Session für die jeweiligen Threads ... müsste doch aber nicht nötig sein da ich diese niemals gelichzeitig aufrufe. Oder ??