AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Thread blockiert beim zweiten Aufruf von Synchronize
Thema durchsuchen
Ansicht
Themen-Optionen

Thread blockiert beim zweiten Aufruf von Synchronize

Ein Thema von hitzi · begonnen am 5. Nov 2008 · letzter Beitrag vom 6. Nov 2008
 
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#1

Thread blockiert beim zweiten Aufruf von Synchronize

  Alt 5. Nov 2008, 14:03
Hallo,

folgender Code blockiert beim zweiten Aufruf/Durchlauf von Synchronize
Delphi-Quellcode:
procedure TWorkerThread.SyncGetNewEntries;
begin
  if Assigned(OnGetNewEntries) then OnGetNewEntries(fWorkList);
end;

procedure TWorkerThread.OnMainTimer(Sender: TObject);
begin
  fMainTimer.Enabled := False;
  if fTriesIt < 3 then begin
    if not StartWork(False, 3, False) then begin
      Inc(fTriesIt);
      fMainTimer.Interval := 60000;
    end else begin
      fTriesIt := 0;
      Synchronize(SyncGetNewEntries); //Erster Aufruf holt noch die Daten
                                      //beim zweiten Timerdurchlauf bleibt er an der Stelle ohne einen Fehler hängen/Programm
                                      //reagiert nicht mehr - wie bei einem Deadlock
      fMainTimer.Interval := 1000;
    end;
    if not fClosingTime then fMainTimer.Enabled := True;
  end;
end;

procedure TWorkerThread.Execute;
var i : Integer;
    msg : tagMSG;
begin
  fWorkList := TSLWorklist.Create;
  fHTTP := TIdHTTP.Create(nil);
  fMainTimer := TTimer.Create(nil);
  try
    fClosingTime := False;
    fMainTimer.Enabled := False;
    fMainTimer.Interval := 1000;
    fMainTimer.OnTimer := Self.OnMainTimer;
    fWaitMS := 5000;
    fHTTP.HTTPOptions := [{hoForceEncodeParams}];
    fMainTimer.Enabled := True;

    while GetMessage(msg, 0, 0, 0) do DispatchMessage(Msg);
    fClosingTime := True;
    fMainTimer.Enabled := False;
    if (fTriesIt < 3) and (fWorkList.Count > 0) then begin
      for i := 0 to fWorkList.Count - 1 do fWorkList.Items[i].ExecuteAfter := Now;
      StartWork(False, 1, True);
    end;
  finally
    fWorkList.Clear;
    FreeAndNil(fMainTimer);
    FreeAndNil(fHTTP);
    FreeAndNil(fWorkList);
  end;
end;
Ich hatte vorher diese Funktionen ohne Problem mit Sleep und ohne Timer genutzt, aber seit dem ich den Aufruf über den Timer mache bleibt es nach dem zweiten Durchlauf hängen. Seht ihr woran das liegen könnte?


Zusatz:

Der bleibt an der folgende Stelle in der Funktion TThread.Synchronize der Unit Classes hängen:
Delphi-Quellcode:
{$IFDEF MSWINDOWS}
        begin
          LeaveCriticalSection(ThreadLock);
          try
            WaitForSingleObject(SyncProcPtr.Signal, INFINITE); //hier wartet die Funktion ewig
          finally
            EnterCriticalSection(ThreadLock);
          end;
        end;
{$ENDIF}
Scheint irgendwie ein Deadlock eingetreten zu sein. Wie kann ich vorgehen, um das Problem zu lösen?
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
 


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 12:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz