Kurze Frage zu Threads und FreeOnTerminate [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Kurze Frage zu Threads und FreeOnTerminate

Beitrag von laz847 »

Hmmm das is echt ganz schön knifflig :D

Nee das nun wieder nicht, ich habs so:

Code: Alles auswählen

type 
tdaten   = record; // (shortstrings, byte, ints, doubles >> also nur zahlen und 2 shortstring)
tarr_dat = array of tdaten;
 
var
globA : array of tarr_dat; // mein globales 2 dim. dynamisches array, wird im hauptprogramm resized auf z.b. SetLength(globA , 40 , 0);
Und so gehts dann wieder nicht oder wie?
Zuletzt geändert von laz847 am Di 31. Mär 2015, 00:47, insgesamt 2-mal geändert.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Kurze Frage zu Threads und FreeOnTerminate

Beitrag von mse »

laz847 hat geschrieben: Und so gehts dann wieder nicht oder wie?
Doch, das ist dasselbe wie "array of array of tdaten".

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Kurze Frage zu Threads und FreeOnTerminate

Beitrag von laz847 »

Das hätte mich jetzt aber auch erschreckt :D.

Aber hätte ja sein können das sich da wieder irgendwas in der internen Speicherverwaltung anders verhält.

Vielen Dank!

Problem, wir sind von der eigentlichen Frage etwas abgekommen.

Der Übersichtlichkeit wegen würde ich Fragen und Antworten zum Thema Array und Datenübergabe lieber hier fortführen : http://www.lazarusforum.de/viewtopic.php?f=10&t=8639

Sonst haben wir nachher alles doppelt und dreifach :D

Also zurück zur eigentlichen Frage:

Code: Alles auswählen

constructor TMyThread.Create();
  begin
    inherited Create(True);
    FreeOnTerminate := True;
    Start;
  end;
Hab ich jetzt so wie anfangs von Socke vorgeschlagen umgesetzt, so sollte ich auf der sicheren Seite sein oder?

Mal noch eine Frage zu dieser Stelle , bin mir da unsicher:

Code: Alles auswählen

for tid := 0 to tcp - 1 do if(Assigned(arr[tid])) and not(arr[tid].Terminated) then Sleep(1);
 
for tid := 0 to tcp - 1 do if(Assigned(arr[tid])) then FreeAndNil(arr[tid]); 
Wann und wo wird vom Thread Terminated gesetzt, es kann sein das ein Thread mal länger z.B. 50 oder 100 ms braucht.

Besteht hier bei diesem Aufbau die Gefahr das der genilt wird während er noch läuft?


Edit : Problem gelöst, mein Aufbau war generell ungünstig. Danke :D

Antworten