AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wieso bekomme ich hier einen Deadlock?

Ein Thema von Zacherl · begonnen am 24. Mai 2010 · letzter Beitrag vom 26. Mai 2010
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#11

Re: Wieso bekomme ich hier einen Deadlock?

  Alt 25. Mai 2010, 09:31
Ich bin nicht sicher. Aber es wäre auf jeden Fall logisch:
1) Thread: sperrt die Liste
2) Thread: Ereigniss wird aufgerufen
3) VLC: sperrt die Liste (wartet auf Freigabe durch Thread)
4) Ereigniss im Thread-Context: synchronisiert mit der VCL

Die Frage ist, wie genau die Synchronisierung stattfindet. Wenn ich vorher von der VCL aus die Liste sperre, wartet der VCL Thread ja aud Freigabe durch den Thread. Synchronisiere ich jetzt im Ereigniss, wird der entsprechende Code ja im Context des VCL Threads ausgeführt.
Interessant ist allerdings jetzt zu wissen, wie das ganze von statten geht. Wird darauf gewartet, dass der VCL Thread irgendwie einen Context Switch durchführt, wäre das ganz klar der Grund für den Deadlock. Ist dies der Fall?

Ich frage deshalb, weil ich mal eine Funktion geschrieben hatte, die auch Code im Context eines fremden Threads ausführen kann. Dabei habe ich allerdings mit SetThreadContext() den EIP manipuliert. In diesem Falle würde der synchronisierte Code ja unabhängig vom Warten auf LockList ausgeführt, wonach dann wieder zum LockList Offset gesprungen wird.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#12

Re: Wieso bekomme ich hier einen Deadlock?

  Alt 25. Mai 2010, 10:17
Synchronisierung funktioniert über Window Messages. Ist der UI-Thread also blockiert, wird tatsächlich nichts abgearbeitet und du hast deinen Deadlock .
Es gibt übrigens eine Regel, beim Halten eines Locks nie Events zu feuern. Denn ein Lock soll ja eigentlich feinkörnig sein, was beim Aufrufen unbekannter Methoden schlecht sichergestellt werden kann .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#13

Re: Wieso bekomme ich hier einen Deadlock?

  Alt 25. Mai 2010, 11:16
Ah okay diese Regel war mir bisher unbekannt Also wäre die optimale Lösung wirklich sowas in der Art:
Delphi-Quellcode:
procedure TdxIDTPSendThread.Execute;
var
  I, X, Y: Integer;
  List: TList;
  Transfer: TdxIDTPTransfer;
begin
  while (not Terminated) do
  begin
    List := FWriter.TransferList.LockList;
    try
      X := 0;
      Y := 0;
      for I := 0 to List.Count - 1 do
      begin
        FWriter.TransferList.UnlockList;
        try
          // OnProgress
        finally
          List := FWriter.TransferList.LockList;
        end;

        // blabla ..
      
        FWriter.TransferList.UnlockList;
        try
          // OnData
        finally
          List := FWriter.TransferList.LockList;
        end;

        if (not Transfer.Priority) then
        begin
          Inc(X);
        end;
        Inc(Y);
      end;
      // Beendete Transfers entfernen
      for I := List.Count - 1 downto 0 do
      begin
        Transfer := TdxIDTPTransfer(List[I]);
        if (Transfer.TransferState = tsFinished) then
        begin
          List.Delete(I);
          Transfer.Free;
        end;
      end;
    finally
      FWriter.TransferList.UnlockList;
    end;
    Sleep(10);
    // Thread suspendieren
    if (Y = 0) then
    begin
      {$WARNINGS OFF}
      Suspend;
      {$WARNINGS ON}
    end;
  end;
end;
Edit: Wobei dann hätte ich halt wieder das Problem, dass von der VCL aus Elemente in der Liste geändert oder sogar entfernt werden könnten. Ist der Thread dann noch in der Schleife und das letzte Element fehlt auf einmal, dann krachts ja wieder
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Wieso bekomme ich hier einen Deadlock?

  Alt 25. Mai 2010, 12:00
Wenn du die Möglichkeit hast, dann wäre es wohl besser die Events außerhalb der "Hauptsperrung" abzuarbeiten.

statt deinem
Code:
thread-schleife
begin
  sperren
    schleife
    begin
      entsperren
        event aufrufen
      sperren
      ...
    end;
  entsperren
  kleine pause
end;
nur einmal sperren und danach die Events abarbeiten
Code:
thread-schleife
begin
  sperren
    schleife
    begin
      event zu 'ner liste hinzufügen
      ...
    end;
  entsperren
  alle gespeicherten events aufrufen
  kleine pause
end;
oder
Code:
thread-schleife
begin
  sperren
    daten schnell aus liste auslesen
  entsperren
  schleife
  begin
    (mit den ausgelesenen/kopierten daten arbeiten)
    event abarbeiten
    ...
  end;
  kleine pause
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#15

Re: Wieso bekomme ich hier einen Deadlock?

  Alt 25. Mai 2010, 12:12
Möglichkeit 3 kommt leider nicht in Frage, aber Nummer 2 sieht interessant aus. Werde ich mal ausprobieren. Solange da von VCL Seiten aus keine Objekte gelöscht werden, müsste das gut gehen. Ansonsten verweisen die Ereignisse in der Liste wiederrum auf Datenobjekte die nicht mehr existieren ..

Edit: Wobei .. Möglichkeit 3 klingt sogar am besten Die Objekte selbst "sollten" bei korrekter Verwendung der Komponente nur im Thread selbst freigegeben werden. Und wenn die Reihenfolge der Liste von der VCL aus geändert wird, dann würde sich das zwar erst im nächsten Zyklus des Threads bemerkbar machen, aber das wäre nicht weiter tragisch. Hinzufügen von Objekten ist ja ebenfalls okay.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

Re: Wieso bekomme ich hier einen Deadlock?

  Alt 26. Mai 2010, 20:26
Dann mal vielen Dank an alle die geholfen haben Der DeadLock entstand tatsächlich wie weiter oben beschrieben. Behoben habe ich das Problem nun, indem ich himitsus Variante 3 verwendet habe.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz