OK, mit den Booleans kannst du ja nur einmal was übermitteln ... was beim Stoppen (mehrmals bitteWarte=True) nicht stört, aber da dann das erste Zurücksetzten (bitteWarte=False) auch gleich gültig ist würde ja de Thread schon mit arbeiten anfangen, sobald der Erste sagt "also von mir aus kannst du losmachen", obwohl andere noch meinen "eh warte".
demnach mußt du also mitzählen wie oft gelockt ist und erst wenn keiner mehr sperrt dann kann's weitergehn
Delphi-Quellcode:
Procedure LockedSet(
Var X: Boolean; i: Boolean);
ASM
LOCK MOV BYTE PTR [&X], &i
End;
Procedure LockedInc(
Var X: Byte);
ASM
LOCK INC BYTE PTR [&X]
End;
Procedure LockedDec(
Var X: Byte);
ASM
LOCK
DEC BYTE PTR [&X]
End;
im Thread dann z.B. 2 Variablen: fShouldStopp und isStopped
(allerdings direkt freigegeben und nicht über Properties, da direkt darauf zugegriffen wird)
Delphi-Quellcode:
procedure TFrmMain.StoppBackgroundTask;
begin
if Assigned(aCyclicDataThread) then
begin
LockedInc(aCyclicDataThread.ShouldStopp);
while not aCyclicDataThread.isStopped do
begin
Sleep(10);
if Terminated then break;
end;
end;
end;
procedure TFrmMain.StartBackgroundTask;
begin
if Assigned(aCyclicDataThread) then
LockedDec(aCyclicDataThread.ShouldStopp);
end;
Delphi-Quellcode:
if ShouldStopp > 0 then
begin
LockedSet(aCyclicDataThread.isStopped, true);
while ShouldStopp > 0 do
begin
Sleep(10);
if Terminated then break;
end;
LockedSet(aCyclicDataThread.isStopped, false);
end;
Aber dabei kommt ein weiteres Problem auf:
denn wenn mehrere mal de Thread gesperrt wird, damit er nicht arbeitet, wenn wo anderes was gemacht wird, dann passiert noch nichts.
Allerdings würde doch dann auch an mehreren Stellen (außerhalb des Threads) zugleich gearbeitet (senden/empfangen) werden
Demanch wäre es besser, wenn es nur eine Stelle gibt, welche arbeiten darf.
Das würde sich ann mit eine "Arbeitsliste" lösen lassen, wo die anderen Stellen dann nur eintragen mach das und das für mich.
Und sag mir dann eventuell noch Bescheid, wenn du fertig damit bist, damit ich weitermachen kann.
Der "Arbeitstread" würde dann einfach nur diese Liste abarbeiten und da er der Einzige ist, welcher auf die Shnittstelle ugreift, kann es da keine Probleme geben.