Hallo
ich bin grade dabei ein Program zu schreiben das während seiner Ausführung unter anderem auch einige
FTP Transfers durchführt. Hierfür benutze ich die
Indy ftpclient Komponente. Damit mein Program während des Transfers noch etwas anderes machen kann hab ich den "
ftp-code" in einen extra Thread ausgelagert. Die execute methode des
ftp threads sieht so aus:
Delphi-Quellcode:
begin
while not Self.Terminated do
begin
case nextaction of
1:connect;
2:disconnect;
3:get;
4:exit;
end;
end;
end;
Die procedures connect, disconnect, get und exit machen jeweils das was in ihrem Namen steht, setzen das event fertig und legen den Thread mit suspend schlafen.
Im Hauptthread wird dann folgendermassen mit dem
ftp Thread gearbeitet
Delphi-Quellcode:
...
ftp:=Tftthread.Create(true);
ftp.nextaction:=1;
// Aktion 1
ftp.Resume;
// do something
while not ((fertig.WaitFor(150))= wrSignaled)
do
begin
Application.ProcessMessages;
end;
fertig.resetevent;
...
ftp.nextaction:=3;
// Aktion 2
ftp.Resume;
// do something
while not ((fertig.WaitFor(150))= wrSignaled)
do
begin
Application.ProcessMessages;
end;
fertig.resetevent;
...
Das Problem ist nun das wenn Aktion 2 unmittelbar auf Aktion 1 folgt der Hauptthread endlos in der while Schleife wartet. Auch ein Brakepoint in der get procedure des
ftp Threads wird nie angespungen. Setze ich aber in der connect procedure einen Brakepoint und lasse das Programm sofort weiterlaufen funktioniert alles. Die Anzeichen deuten auf ein timing Problem, nur kann ich leider keins erkennen.