Erstmal danke für die Antworten, da habe ich ja kräftig was zum lesen
Also erstmal wofür ich das brauche, ich habe Threads die verschiedene Dinge berechnen und dann eine Funktion aufrufen, die aber nicht simultan benutzt werden kann.
Dafür so etwas wie eine Warteschlange. Das Konzept wird auf jeden Fall noch überarbeitet, aber jetzt habe ich den Stolz das noch zu schaffen
Zu den Semaphoren. Wie werde die genau benutzt bzw wie funktionieren die?
Habe mir mal die Demo dazu angeguckt und den Text mal angelesen.
Die Demo sah vielversprechend aus.
Ich habe mal versucht das grob nachzubauen.
Das ist bis jetzt draus geworden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| TTestThread = class(TTHread) private FSleepDuration: Integer; FWaitForDuration: Integer; protected procedure execute; override; public property SleepDuration: Integer write FSleepDuration; property WaitForDuration: Integer write FWaitForDuration; end;
var Form1: TForm1; Semaphore : THandle;
implementation
{$R *.dfm}
procedure KannNurEinmalGleichzeitigBenutztWerden; forward;
procedure TTestThread.Execute; var WaitResult: Integer; begin WaitResult := WaitForSingleObject(Semaphore, FWaitForDuration); sleep(FSleepDuration); ReleaseSemaphore(Semaphore, 1, nil); KannNurEinmalGleichzeitigBenutztWerden; end;
procedure KannNurEinmalGleichzeitigBenutztWerden; begin showmessage('n/a'); end;
procedure TForm1.FormCreate(Sender: TObject); var Threads : array [1..5] of TTestThread; i : integer; begin for i := 1 to 5 do begin Threads[i] := TTestThread.Create; with Threads[i] do begin FreeOnTerminate := True; SleepDuration := 2000; WaitForDuration := INFINITE; Resume; end; end; end;
initialization Semaphore := CreateSemaphore(nil, 1,1,'');
finalization CloseHandle(Semaphore);
end. |
Klappt soweit, er führt alle schön nacheinander aus. Aber wie kann ich jetzt immer warten bis der vorherige Thread mit der KannNurEinmalGleichzeitigBenutztWerden; Prozedur fertig ist?
Hoffe, ihr könnt es besser nachvollziehen als ich
Lg
Edit : Hat geklappt, danke! Irgendwann ist mir aufgefallen, dass der Release vor der Prozedur stand.