Zitat:
DU mußt also den Zugriff darauf irgendwie synchronisieren, z.B. mit einer CriticalSection oder passenden threadsicheren Komponenten ala TThreadList.
Ja, das stimmt. Den Code habe ich aber aus einem Beispiel von OmniThreadLibrary abgeleitet. Test_46.
Dort ist es auch so deklariert. Ich habe eine interne Schleife zusätzlich eingebaut und paar Sachen die für mich relevant sind dazu geschrieben.
Die Übergabe an den Hauptthread wird dort aber genau so angegeben. Darum frage ich die Profis was Sache ist.
Bin etwas durcheinander. Ich kenne es eigentlich auch so, dass man den Thread synchronisiert und nicht direkt anspricht.
Hier möchte ich noch etwas hinzufügen.
Ich kann mehr oder weniger mit Threads umgehen,bis jetzt habe ich die Class von Delphi-Praxis benutzt. Hat so weit alles gut geklappt.
Mir geht es um das Lernen. OmniThreadLibrary soll wohl sehr gut sein, deshalb versuche ich ein wenig zu testen.
Das ist das Original aus der Hilfe von OmniThreadLibrary
Delphi-Quellcode:
uses
OtlTaskControl,
OtlParallel;
{$R *.dfm}
procedure TfrmDemoParallelAsync.btnAsyncClick(Sender: TObject);
begin
btnAsync.Enabled := false;
Parallel.Async(
procedure
begin
// executed in background thread
Sleep(500);
MessageBeep($FFFFFFFF);
end,
Parallel.TaskConfig.OnTerminated(
procedure (const task: IOmniTaskControl)
begin
// executed in main thread
btnAsync.Enabled := true;
end
)
);
end;
Ok, ich denke hier ist einiges falsch.
Delphi-Quellcode:
Status := Liste.Strings[0];
Liste.Delete(0);
Memo1.Lines.Add(Status);
Meine Frage dazu.
Die ersten zwei Zeilen. Kann ich so auf die Liste zugreifen?
Ich denke, dass die dritte Zeile nun irgendwie synchronisiert werden muss.
Oder sind alle 3 Zeilen in der Form nicht akzeptabel?
Die Threads greifen nämlich auf die globale Liste zu. Darf es so bleiben?
PS: Die Hilfe bei
http://docwiki.embarcadero.com ist vorsichtig ausgedrückt sehr mager. Ein Anfänger wird garantiert nie eine Thread basierte Anwendung danach schreiben können.