mh das break; habe ich geschickt überlesen....
Sehe ich das richtig, dass "Main" nicht innerhalb des Threads deklariert wurde, sondern außerhalb im MainThread?
Dann würde ich 2 Sachen vorschlagen (Bin nicht sooo der Thread-Profi, aber ein Versuch ist es ja mal Wert):
Übergib Main dem Threads über den Pointer-Parameter und greife dann darauf zu. Also ungefähr so:
Delphi-Quellcode:
// Kenn die Parameter nicht auswendig. Ich begrenze es mal auf
// 1. Pointer zur Threadfunktion
// 2. Parameter (p)
BeginThread(@Thread,Main);
function Thread(p: Pointer): Integer;
var i: Integer;
ThreadMain: TMain; //Ka was fürn Typ Main hat.
begin
if TObject(p) is TMain then
ThreadMain := TMain(p)
else
exit;
while (1=1) do begin
if ThreadMain.List.Count >= 1 then begin
// ...
end;
// ...
end;
end;
Wenn du nicht auf die
VCL verzichtest, könntest du es auch mal mit einer Ableitung von TThread probieren und deine ganzen Aufrufe mit Synchronize synchronisieren.
Edit Nr. 12+13 (?!): Habe gemerkt, dass folgender Abschnitt eine ganze Menge Unsinn enthält. Da ich allerdings müde bin (2:52 Uhr) und ich nicht nochmehr Mist erzählen will, werde ich das evtl morgen berichtigen.
Was anderes: Du könntest eine Klasse von TList ableiten, die sich selbst um die Freigabe der Daten hinter einem Pointer kümmert:
Delphi-Quellcode:
interface
type
TListEx = class(TList)
protected
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
end;
implementation
{ TListEx }
procedure TListEx.Notify(Ptr: Pointer; Action: TListNotification);
begin
if Action = lnDeleted then
Dispose(Ptr);
end;
Dann würde ein:
Main.List.Delete(i);
reichen
(Ist allerdings (noch) ungetestet)
Edit:
Also funktionieren tut es, aber ich habe gemerkt, dass man, wenn man keine Memory-Leaks verursachen will, die Strings im Record manuell freigeben muss. D.h. SetLength(Str,0) oder Str := ''; So ist es zumindest bei meinem Test-Record gewesen.
Dieses Problem verschwindet allerdings, wenn man PChars statt Strings benutzt. Die PChars muss man auch nicht manuell freigeben. (Außer, man reserviert für sie manuell Speicher, was man aber meistens nicht tut (WinAPIs ausgenommen))
Und weil ich so gerne editiere, fasse ich mal meine Aussagen zusammen^^:
Main über den p-Parameter der Threadfunktion übergeben
Ggf.
VCL-Threads benutzen und Synchronize benutzen
Meine TListEx benutzen
In dem Record PChars statt Strings benutzen.