Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Deadlock beim stoppen eines Arbeiter Threads

  Alt 11. Mär 2007, 16:59
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.
$2B or not $2B
  Mit Zitat antworten Zitat