Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm nicht mehr ansprechbar (https://www.delphipraxis.net/5835-programm-nicht-mehr-ansprechbar.html)

CalganX 20. Jun 2003 15:49


Programm nicht mehr ansprechbar
 
Hi,
ich programmiere ja derzeit an meinem "DreamCatcher" (siehe Freeware-Section). Leider ist das Programm während dem codieren nicht mehr ansprechbar. Ich habe den Aufruf in einen Thrad ausgelagert (keine Ahnung, ob das was bewirkt). Folgende Source:
Delphi-Quellcode:
  TEncryptionThread = class(TThread)
  public
    fInFileName: string;
    fOutFileName: string;
    fPassphrase: string;
  protected
    procedure execute; override;
  end;

procedure TEncryptionThread.execute;
var
  DCPCipher: TDCP_blowfish;
  source, dest: TFileStream;
begin
  source := TFileStream.Create(fInFileName, fmOpenRead);
  dest := TFileStream.Create(fOutFileName, fmCreate);
  DCPCipher := TDCP_blowfish.Create(nil);
  DCPCipher.InitStr(fPassphrase, TDCP_sha1);
  DCPCipher.EncryptStream(source, dest, source.size);
  DCPCipher.Burn;
  dest.Free;
  source.Free;
  FreeAndNil(DCPCipher);
end;
Folgendermaßen rufe ich das ganze auf:
Delphi-Quellcode:
var
  tEncrypt: TEncryptionThread;
// ...
    tEncrypt := TEncryptionThread.Create(true);
    tEncrypt.Priority := tpIdle;
    tEncrypt.FreeOnTerminate := true;
    tEncrypt.fInFileName := EncryptInputFile.FileName;
    tEncrypt.fOutFileName := EncryptOutputFile.FileName;
    tEncrypt.fPassphrase := repeatPass;

    ProgressForm.Show;
    ProgressForm.ProgressBar1.Min := 0;
    ProgressForm.ProgressBar1.Max := GetFileSize(EncryptInputFile.FileName).QuadPart;
    ProgressForm.AsFileName := EncryptOutputFile.FileName;
    ProgressForm.Timer1.Enabled := true;

    tEncrypt.execute;

    ProgressForm.Timer1.Enabled := false;
    ProgressForm.Close;

    MessageDlg('File successfull encrypted.', mtInformation, [mbOK], 0);
Da drin steckt auch ein anderes Problem: nach dem anzeigen des ProgressForm wird das Form angezeigt, allerdings weder neugezeichnet noch komplett gezeichnet (ähnlich wie beim Hauptfenster).

Habt ihr dafür eine Lösung/Idee wie man das ganze einigermaßen normalisieren kann?

Chris

Jens Schumann 20. Jun 2003 18:54

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chakotay1308,
in die Anlage habe ich Dir ein Beispiel für eine Thread gepackt, der
lange läuft und auf dem Hauptformular einen TProgressbar steuert.
Code:
tEncrypt := TEncryptionThread.Create(true);
ist schon richtig aber ein Thread wird nicht mit
Code:
tEncrypt.execute;
gestartet sondern mit
Code:
TThread.Resume
Ein Thread erhält seine Rechenzeit vom Scheduler des Betriebssystems. Dafür muss der Thread aber zum "Leben erweckt werden". Mit
Code:
tEncrypt.execute;
rufst Du aus dem Hauptformular die Execute Methode auf. Deshalb wird die Methode auch im Kontext dem Hauptthreds der Anwendung ausgeführt. Deshalb wird auch Dein Formular nicht aktualisiert.

CalganX 20. Jun 2003 18:59

OK. Scheint zu funktionieren!

DANKE!

Chris

Luckie 20. Jun 2003 19:01

Wenn man ihn mit FALSE erzeugt, wird er mit der Methode Execute auch erzeugt. Zu mindets ist das bei meinem Life Of Luckei so.

CalganX 20. Jun 2003 19:07

Das ist mir jetzt aber ziemlich suspekt.
Es funktioniert so, wie ein Thread funktionieren soll...
Kann man irgendwie abfragen, ob ein Thread noch läuft?

Das Problem ist einfach, dass ich bei dieser Art, dann keine Progressbar anzeigen kann und das ist dann doch nicht das wahre... Außerdem wird der Thread ausgeführt, ohne das der User davon merkt das ist nicht unbedingt das, was gewünscht ist... ;)

Chris

Jens Schumann 20. Jun 2003 19:07

Hallo Luckie,
Zitat:

Wenn man ihn mit FALSE erzeugt, wird er mit der Methode Execute auch erzeugt.
Das ist richtig. Jedoch wird dann auch direkt nach der Zeile
Code:
Thread:=TThread.Create(False)
vielleicht sogar noch früher (man weiß ja nie wann der Thread wieder einen TimeSlot erhält) die Execute Methode aufgerufen. D.h. die Execute Methode kann schon laufen, bevor Du die restlichen Properties des Threads gesetzt hast.
Ich weiß ja nicht was Andere empfehlen. Ich aber Empfehle Thread grundsätzlich suspended zu erzeugen und gezielt mit Resume zu starten.

CalganX 20. Jun 2003 19:09

Ich nehme meine Frage zurück!!!

Ich habe den Anhang vergessen...

Chris

Luckie 20. Jun 2003 19:33

Stimmt und ich habe diese Methode gewählt, weil ich nichts mehr initialisieren muß.
Chakotay sollte mal deine Methode probieren und dann mal Bescheid sagen.

Jens Schumann 20. Jun 2003 19:35

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chakotay1308
Zitat:

Kann man irgendwie abfragen, ob ein Thread noch läuft?
Ja das kann man. Man kann z.B. ein boolsche Variable nach dem Create auf True setzen und in OnTerminated wieder auf False. Solange die Variable True ist läuft auch der Thread.
Der Haken ist aber, was passiert wenn sich der Thread aufhängt. Z.B. eine Methode hängt in einer Endlosschleife oder so. Deshalb solltest Du zusätzlich an den Thread mit PostThreadMessage eine Botschaft schicken. Innerhalb der Execute-Methode basteln wir uns mit PeekMessage eine kleine MessageLoop. Die Botschaft, die wir mit PostThreadMessage gesendet haben beantwortet der Thread mit einer Message an das Hauptformular. Wenn die Variable True ist und unsere Message beantwortet wird, wissen wir dass der Thread noch läuft. Ist es nicht möglich für PostThreadMessage die Boschaft abzuschicken ist der Thread beendet. Wird unsere Botschaft nicht beantwortet und unsere Variable ist True wissen wir dass der Thread hängt. Dann wird nämlich auch nicht PeekMessage verarbeitet.

Im Anhang habe ich das mal demonstriert.

CalganX 20. Jun 2003 20:01

*umpf*
Versuche gerade deinen Source aus dem ersten Anhang so umzusetzen, dass ich das nutzen kann.

Werde mich dann nochmal melden.

Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz