Multithread klappt nich.. aber warum nicht?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
SiMoeBoe
Beiträge: 28
Registriert: So 13. Mär 2011, 22:16
OS, Lazarus, FPC: Ubuntu (L 0.9.28.2-10ubuntu1 FPC 2.4.0)

Multithread klappt nich.. aber warum nicht?

Beitrag von SiMoeBoe »

hallo leute,

In meinem derzeitigen Projekt benötige ich mehrere Threads.
Da ich sowas unter Lazarus bisher noch nicht gemacht habe, hab ich mehr oder weniger nach dieser Anleitung gearbeitet:
http://wiki.lazarus.freepascal.org/Mult ... utorial/de

Leider produziert mein Code aber einen TApplication.HandleException Access violation
Ich rufe meinen Thread (TAddDir) wie folgt auf:

Code: Alles auswählen

procedure Tfrmhaupt.AddDirToBiblio;
var AddDir:TAddDir;
begin
 if not adddirbol then
 begin
  anzeigeprogressbar[1] := Progressbar2; //Irrelevant für den Fehler..
  AddDir.Create(true);                           //Der Aufruf
  AddDir.Resume;                                  //Hierher komme ich gar nicht erst...
  ShowMessage('Daten werden hinzugefügt.');
 end else
  ShowMessage('Es wird bereits e...');
end;
Soweit sogut.
im constructor Create() (in einer anderen Unit(!)) wird dann der Fehler erzeugt:

Code: Alles auswählen

constructor TAddDir.Create(CreateSuspended:boolean);
begin
 FreeOnTerminate := true; //Hierbei wird der Access violation erzeugt und der Aufruf bricht ab..
 inherited Create(CreateSuspended);
end;
Kann mir jemand sagen, wo ich hier einen Fehler im Aufruf habe? Bzw warum er mir da n Fehler ausspuckt?
Leider habe ich keine Möglichkeit den Lazaruseigenen Debugger/das Nachrichtenfenster einzusehen, da das Programm nur über startscript zu starten ist und nicht über Lazarus.
Habe also nur die Fehlermeldungen des Terminals:

Code: Alles auswählen

TApplication.HandleException Access violation
  Stack trace:
  $00000000
  $0808CA6F
  $0809FDC8
  $0818EA51
  $0818F058
  $0806C28A
  $081F0A9B
  $0829A973
  $004FBF2C
  $004EC412
  $00502B85
  $00503FAC
  $00504452
  $00377945
  $002553A0
  $00256D3F
  $0024BA54
Ich hoffe, einer von euch wird daraus schlauer wie ich^^
Wäre echt super;-)

Viele Grüße,
SiMoeBoe
Zuletzt geändert von SiMoeBoe am Fr 6. Mai 2011, 01:03, insgesamt 2-mal geändert.
Woran du glaubst, dafür sollst du leben und sterben.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Multithread klappt nich.. aber warum nicht?

Beitrag von MAC »

Code: Alles auswählen

AddDir := TAddDir.Create(true);
ist ein allgemeiner Fehler hat nichts besonders mit multithreading zu tun...
Das gilt generell für alle Klassen. (also auch aMemo := TMemo.Create(Form1) ... )
Wieso das sorum richtig ist kann ich nicht sagen. Ich schätze mal das es hiebei ein TaddDir erstellt und ordnet den Pointer des erstellten TaddDir der Variable Adddir zu.

Edit:
Wenn's dann immer noch nicht klappt unter lazarus/examples in deinen lazarusordner gibt es ein beispielprojekt. Das kannst du dir ja mal anschauen
Zuletzt geändert von Lori am Fr 6. Mai 2011, 23:28, insgesamt 1-mal geändert.
Grund: Highlighter

Code: Alles auswählen

Signatur := nil;

SiMoeBoe
Beiträge: 28
Registriert: So 13. Mär 2011, 22:16
OS, Lazarus, FPC: Ubuntu (L 0.9.28.2-10ubuntu1 FPC 2.4.0)

Re: Multithread klappt nich.. aber warum nicht?

Beitrag von SiMoeBoe »

Hey Ho Mac,
Vielen Dank.
Da überlegt man hin- und her und dann ist es solch ein Anfängerfehler^^
Hab zwar jetzt noch einige andere Fehler, aber werd mir erstmal das genannte Beispielprojekt ansehen.
Diese Frage jedenfalls scheint ERLEDIGT

Viele Grüße,
SiMoeBoe
Woran du glaubst, dafür sollst du leben und sterben.

cybersnacker
Beiträge: 8
Registriert: Do 26. Apr 2007, 02:04
OS, Lazarus, FPC: Debian
CPU-Target: 32/64
Wohnort: 23566 Lübeck

Re: [ERLEDIGT] Multithread klappt nich.. aber warum nicht?

Beitrag von cybersnacker »

SiMoeBoe hat geschrieben:

Code: Alles auswählen

constructor TAddDir.Create(CreateSuspended:boolean);
begin
 FreeOnTerminate := true; //Hierbei wird der Access violation erzeugt und der Aufruf bricht ab..
 inherited Create(CreateSuspended);
end;
scheint...

mit adddir.create referenzierst Du ja direkt die Objektträgervariable, welche selber noch nicht instantiiert ist und somit auch noch keine Referenz auf das Objekt trägt. Bei dem Urfahrkonstruktor wird ja zuallererst der Speicher reserviert und dieser muss zugewiesen werden. Von daher muss man sich fragen, ob der Konstructor eine Klassenmethode oder eine Objektmethode ist? Ich grüble selber gerade...

Definitiv jedoch ist es wichtig im Konstruktor erst die Prozesskette der Elternklassen zum Erstellen via inherited durchzuführen, bevor man auf Eigenschaften und Methoden des Objektes zugreift. Mit anderen Worten ist die Codierungsreihenfolge in Deinem Konstruktor falsch.

SiMoeBoe
Beiträge: 28
Registriert: So 13. Mär 2011, 22:16
OS, Lazarus, FPC: Ubuntu (L 0.9.28.2-10ubuntu1 FPC 2.4.0)

Re: Multithread klappt nich.. aber warum nicht?

Beitrag von SiMoeBoe »

Da muss ich dir glaube ich wiedersprechen.
FreeOnTerminate ist ein property der Klasse TThread.
Dieser wird vor dem eigentlichen Create gesetzt.
Es bedeutet, dass sich nach erfolgtem executing der Thread selbst beendet, bzw Free wird.
s. dazu: http://lazarus-ccr.sourceforge.net/docs ... inate.html" onclick="window.open(this.href);return false;

Mein eingangs beschriebenes Problem wurde wirklich durch meinen Fehler bzgl

Code: Alles auswählen

AddDir := TAddDir.create();
erzeugt.
Dass ich nun immer noch Fehler habe liegt nicht an dem constructor, sondern erfolgt erst nach AddDir.Resume; und innerhalb des dadurch erfolgenden Aufruf von TAddDir.Execute;
Dabei habe ich vermutlich einen Fehler beim Syncronize, sodass sich der Hauptthread und AddDir in die Quere kommen.
Dem werde ich aber erst morgen oder Samstag auf den Grund gehen können;-)

Hoffe mein Einwand war richtig und ich habe nicht doch was übersehen, ansonsten bitte um Entschuldigung.
Vielen Dank aber für das Interesse und die Hilfe!!

Viele Grüße,
SiMoeBoe
Zuletzt geändert von Lori am Fr 6. Mai 2011, 23:28, insgesamt 1-mal geändert.
Grund: Highlighter
Woran du glaubst, dafür sollst du leben und sterben.

Antworten