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?