Autor Beitrag
JJ
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100

Windows XP 64 bit!
delphi 5
BeitragVerfasst: Di 02.09.08 22:34 
Hallo Leute!
Ich benötige eure Hilfe bezüglich eines Problems (war zu erwarten oder? ich habe es trotzdem mal so formuliert ;-)
Ich möchte einen thread so lange anhalten, bis eine Anwendung die über ihn gestartet wurde wieder beendet ist.
Das hat soweit auch absolut super funktioniert, aber wenn es auf der GUI irgendwelche Veränderungen gibt, soll die gestartete Applikation (auf deren Ende gewartet wird) bereits vorzeitig terminiert werden.
Ich bekomme etwa 1000000 Access Violations uns weiß eigentlich auch warum ;-), aber nicht wie ich es anders machen kann.
Ich muss noch irgendetwas machen bevor ich den Process terminieren kann.
Wichtig ist, dass ich auch GENAU DIE INSTANZ des Programmes Terminiere die in exinfo ist.
Liegts vielleicht daran ,dass ich keinen ExitCode angegeben habe?

Es folgt mein Codefetzen :-)
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
procedure Download.StartAndWait(FileName: string; Params: string; Name : string);
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    ExInfo.lpVerb := 'open';
    ExInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := SW_HIDE;  //Application wird versteckt geöffnet
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    begin
        if Abgebrochen then
                begin
                TerminateProcess(Exinfo.HProcess,Null);
                if fileexists(form6.SavetoPath+Name+'.flv'then deletefile(form6.SaveToPath+Name+'.flv');
                if fileexists(form6.SavetoPath+Name+'.avi'then deletefile(form6.SaveToPath+Name+'.avi');
                if fileexists(form6.SavetoPath+Name+'.mp4'then deletefile(form6.SaveToPath+Name+'.mp4');
                if fileexists(form6.SavetoPath+Name+'.mp3'then deletefile(form6.SaveToPath+Name+'.mp3');
                break;
                exit;
                end;
    Application.ProcessMessages;
    end;
  CloseHandle(Ph);
end;



Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am So 07.09.2008 um 23:08

_________________
Hallo!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 05.09.08 13:27 
Du wartest statt unendlich einfach nur sagen wir 100ms im Thread, dafür aber in einer Schleife. Der WaitForSingleObject-Befehl liefert dir einen Status zurück. Ist dieser TIMEOUT, läuft die andre Anwendung noch, ist dieser OBJECT_0, wurde die Anwendung beendet.

BEvor du nun aber erneut wartest, überprüfst Du einen globalen Status (der vom Mainthread hereingereicht wird), ob die Anwendung terminiert werden soll.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
JJ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100

Windows XP 64 bit!
delphi 5
BeitragVerfasst: Sa 06.09.08 15:06 
danke für deine Antwort, aber ist das nicht genau das was ich tue? Ich prüfe anhand einer Bariable (Boolean) ob ich die anwendung terminieren soll... nur er macht es halt nicht ohne fehlermeldung (das terminieren)

_________________
Hallo!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 06.09.08 16:36 
Könntest Du die Art des Fehlers bitte etwas genauer dann erklären???

Hast Du für deine Strukturen überall Speicher alloziiert?

Warum nutzt Du den With-Block nicht vollständig, wenn Du ihn schon angibst?

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.