![]() |
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:
Folgendermaßen rufe ich das ganze auf:
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;
Delphi-Quellcode:
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).
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); Habt ihr dafür eine Lösung/Idee wie man das ganze einigermaßen normalisieren kann? Chris |
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:
ist schon richtig aber ein Thread wird nicht mit
tEncrypt := TEncryptionThread.Create(true);
Code:
gestartet sondern mit
tEncrypt.execute;
Code:
Ein Thread erhält seine Rechenzeit vom Scheduler des Betriebssystems. Dafür muss der Thread aber zum "Leben erweckt werden". Mit
TThread.Resume
Code:
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.
tEncrypt.execute;
|
OK. Scheint zu funktionieren!
DANKE! Chris |
Wenn man ihn mit FALSE erzeugt, wird er mit der Methode Execute auch erzeugt. Zu mindets ist das bei meinem Life Of Luckei so.
|
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 |
Hallo Luckie,
Zitat:
Code:
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.
Thread:=TThread.Create(False)
Ich weiß ja nicht was Andere empfehlen. Ich aber Empfehle Thread grundsätzlich suspended zu erzeugen und gezielt mit Resume zu starten. |
Ich nehme meine Frage zurück!!!
Ich habe den Anhang vergessen... Chris |
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. |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chakotay1308
Zitat:
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. |
*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. |
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