ich habe mir da eine kleine "Lösung" für mein Problem gebastelt und wollte mal eure Meinung hören.
Worum es geht :
Ich habe ein TThread bei dem Rufe ich eine Routine vom Hauptthread aus auf, welche den Thread mit Arbeit versorgt.
Die Routine soll ein Ergebniss berechnen, dieses kann entweder berechnet werden, dann kommt es zurück, oder es dauert länger als 10ms dann kommt der Fehlercode.
Und hier ist meine Implemenetierung:
Code: Alles auswählen
// Der Teil der die Arbeit macht
Procedure TTest.Execute;
Var
wi: integer;
Begin
While Not Terminated Do Begin
If fNeedWorkToDo Then Begin
fIsWorking := true;
wi := fWorkIndex;
If random(100) < 10 Then Begin // in 10 % aller Fälle können wir das Ergebnis nicht verarbeiten und brauchen ewig zum Auflösen..
sleep(200);
End;
fWorkResult := inttostr(wi);
fNeedWorkToDo := false;
fIsWorking := false;
End;
sleep(1);
End;
End;
// Der Teil der die Arbeit aus dem Hauptthread entgegen nimmt und weiterreicht
Function TTest.DoWork(Index: integer): String;
Var
i: int64;
Begin
If fIsWorking Then Begin // So lange der Thread noch Arbeitet kann nichts bearbeitet werden also Raus
result := '?';
exit;
End;
fWorkIndex := index;
fWorkResult := '?';
fNeedWorkToDo := true; // Dem Thread Execute das Startsignal geben
(*
* Wir warten maximal 10ms, dann brechen wir ab.
* ist Der Thread vorher Fertig setzt er sein fNeedWorkToDo auf False und wir können das Ergebnis
* übernehmen
*)
i := GetTickCount64;
While (GetTickCount64 - i <= 10) And fNeedWorkToDo Do Begin
End;
result := fWorkResult;
End;
Unter der Annahme dass das schreiben eines Boolean Wertes Atomar ist, habe ich 2 Kontrollflussvariablen "fIsWorking" und "fNeedWorkToDo" die sicherstellen, dass ich keine ReadModifyWrite Probleme bekomme.
Wenn man das Testprogramm laufen läst scheint alles zu funktionieren. Aber ist diese Implementierung OK / Erlaubt / ThreadSave / .. ?