Zitat von
shmia:
Du darfst die offenen Arrays nach Start der Threads nicht mehr resizen.
Das würde mich aber hart treffen.
Ich habe mal ein kleines Beispiel gebaut, wie ich das abwickeln wollte. Lief jetzt eineinhalb Stunden ohne Probleme.
Delphi-Quellcode:
type
TT =
class(TThread)
procedure execute;
override;
end;
TForm1 =
class(TForm)
Button1: TButton;
Memo1: TMemo;
Timer1: TTimer;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
public
procedure writedisplay;
procedure initarray;
end;
var
Form1: TForm1;
array1 :
array of integer;
Mutex : THandle;
T : TT;
implementation
{$R *.dfm}
procedure TT.execute;
begin
priority := tplower;
application.ProcessMessages;
while not terminated
do
begin
try
if WaitForSingleObject(
Mutex,INFINITE) = WAIT_OBJECT_0
then
synchronize(Form1.writedisplay);
finally
ReleaseMutex(
Mutex);
end;
sleep(100);
end;
end;
procedure TForm1.initarray;
var
i : integer;
begin
randomize;
setlength(array1,0);
setlength(array1,random(100000));
Label1.Caption := IntToStr(high(array1)+1);
for i := 0
to high(array1)
do
begin
array1[i] := random(100);
end;
end;
procedure TForm1.writedisplay;
var
i : integer;
begin
Memo1.Clear;
for i := 0
to high(array1)
do
begin
Memo1.Lines.Add(IntToStr(array1[i]));
//application.ProcessMessages;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
initarray;
if timer1.Enabled
then
begin
timer1.Enabled := false;
T.Terminate;
end
else
begin
timer1.Enabled := true;
T := TT.Create(false);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
try
if WaitForSingleObject(
Mutex,INFINITE) = WAIT_OBJECT_0
then
begin
initarray;
end;
finally
ReleaseMutex(
Mutex);
end;
end;
initialization
Mutex := CreateMutex(
nil,false,
nil);
finalization
Mutex := CreateMutex(
nil,false,
nil);
Ist das so tatsächlich nicht zulässig?
Grüße, Messie