Die Frage, ob das Setzen von Längen in einem globalen Array per Thread möglich ist, hätte ich mir in einem Test versucht zu beantworten
Hatte ich und es geht ja auch, nur war die andere Frage ob es Probleme machen kann und ob ich mit SetLength oder nil arbeiten muss während ich das tue.
Was ich dir aber noch mitgeben möchte ist, dass wenn immer ich ein Bug habe (und kann ihn nicht lokalisieren), versuche ich diesen mit Reduktion aufzuspüren. D.h. ich erstelle eine Kopie vom Projekt und schmeiße die Teile raus, die mir stabil scheinen, bis irgendwann der Fehler übrigbleibt.
Genau das mach ich gerade, ich hatte bereits alles bis auf die Stellen die ich jetzt hier im Forum angefragt habe ausgeschlossen.Wo ich mir unsicher war, hab ich nachgefragt. Dabei hat sich jetzt ein wichtiger Unterschied ergeben. Pro Durchlauf brauche ich ca. 100 ms, das heißt ich habe in der Schleife tagelang alle 100ms Millionen mal Threads created, freigegeben, wieder neu created, freigegeben usw...
Code: Alles auswählen
while(true) do begin
for tid := 0 to tcp - 1 do begin
if(arr[tid] = nil) then arr[tid] := TEvoThread.Create(tid + 1);
if(tid = 0) then while(not(arr[0].thread_1_ready)) do Application.ProcessMessages;
end;
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]);
// globales Array globA lesen und darstellen
end;
Wenn hier mal nicht der Hase im Pfeffer liegt

?
Setzen von Längen in einem globalen Array per Thread möglich ist
Das wurde nur durch meinen komischen Aufbau möglich, blöd trifft dumm sozusagen

...
Wenn Du magst, ich baue da gerade weiter dran rum, hab den Timer raus und das Zeichnen mit in die syncronisierte Funktion genommen. Alle Sleeps raus, ich will mal sehen wie sauber das unter Volllast läuft. 1 Thread läuft ruckelfrei, bereits ab 2 ruckelts, wie machen die das z.B. im Systemmonitor wo 4 gleichzeitig ohne (sichtbares) Ruckeln angezeigt werden?
Code: Alles auswählen
Synchronize(@ShowData);
procedure TMyThread.ShowData; // so wird NUR gezeichnet wenn neue daten anliegen
var
LS: TLineSeries;
begin
Daten[FNr] := FData;
case FNr of
1: LS := Form1.Chart1LineSeries1;
2: LS := Form1.Chart1LineSeries2;
3: LS := Form1.Chart1LineSeries3;
4: LS := Form1.Chart1LineSeries4;
5: LS := Form1.Chart1LineSeries5;
6: LS := Form1.Chart1LineSeries6;
7: LS := Form1.Chart1LineSeries7;
end;
LS.BeginUpdate;
LS.Clear;
LS.AddArray(Daten[FNr]);
LS.EndUpdate;
Form1.Repaint;
Application.ProcessMessages; // hilft hier nicht
end;
Edit : Aha, weil ich das Sleep() entfernt habe ruckelts bei mir, das Sleep() im WT sorgt dafür das die auch mal bissl Luft lassen, damit der MT rechnen kann. Coole Sache

Mit Sleep(10) laufen gerade 10 Threads vollkommen ruckelfrei, man kann während die Threads volle Kanne rechnen den Chart zoomen, verschieben usw... Sauber, DANKE

.
Code: Alles auswählen
procedure TMyThread.Execute;
var
i , Cnt: Integer;
begin
while not terminated do begin
for i := 0 to 99 do FData[i] := ((7.5 - FNr)/3.5 - 1)/1.2 + Sin(i/5 + Cnt*FNr/50)/5;
Synchronize(@ShowData);
Inc(Cnt);
Sleep(10); // wichtig
end;
end;
Und mal die Frage an Theo, kriegst man/Du das ohne Threads (evtl. mit mehr Daten) auch so hin?