AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programm nicht mehr ansprechbar

Ein Thema von CalganX · begonnen am 20. Jun 2003 · letzter Beitrag vom 20. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Programm nicht mehr ansprechbar

  Alt 20. Jun 2003, 16:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2
  Alt 20. Jun 2003, 19:54
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.
Angehängte Dateien
Dateityp: zip thread.zip (187,8 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 20. Jun 2003, 19:59
OK. Scheint zu funktionieren!

DANKE!

Chris
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 20. Jun 2003, 20: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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5
  Alt 20. Jun 2003, 20: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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#6
  Alt 20. Jun 2003, 20: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.
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#7
  Alt 20. Jun 2003, 20:09
Ich nehme meine Frage zurück!!!

Ich habe den Anhang vergessen...

Chris
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 20. Jun 2003, 20: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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#9
  Alt 20. Jun 2003, 20:35
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.
Angehängte Dateien
Dateityp: zip thread_179.zip (190,4 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#10
  Alt 20. Jun 2003, 21:01
*umpf*
Versuche gerade deinen Source aus dem ersten Anhang so umzusetzen, dass ich das nutzen kann.

Werde mich dann nochmal melden.

Chris
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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