Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Einfrieren des Programms verhindern (https://www.delphipraxis.net/102238-einfrieren-des-programms-verhindern.html)

Todd 25. Okt 2007 12:59


Einfrieren des Programms verhindern
 
Hallo zusammen,

ich habe ein Programm, dass vom Nutzer Daten entgegennimmt und diese dann an eine .dll weitergibt.
Dort findet die Berechnung statt.

Das Programm wartet bist der Rückgabewert vorhanden ist und verfährt dann weiter.

Diese Berechnung kann unter Umständen Stunden dauern.

Wie kann ich verhindern, dass durch die lange Berechnungszeit mein Programm "einfriert" bzw. einen Status "keine Rückmeldung" bekommt?

Vielen Dank im Voraus
Todd

Nuclear-Ping 25. Okt 2007 13:03

Re: Einfrieren des Programms verhindern
 
Stunden ... ?

Application.ProcessMessages in die Berechnungsschleife.

peschai 25. Okt 2007 13:04

Re: Einfrieren des Programms verhindern
 
Bei solchen aktivitäten bitte prüfen ob es nicht besser wäre mit threads zu arbeiten

RavenIV 25. Okt 2007 13:14

Re: Einfrieren des Programms verhindern
 
zwei Ansätze fallen mir da ein:

1) einen seperaten Thread, der die Werte an die DLL gibt und auf Antwort wartet.

2) Asynchrone Abarbeitung. An die DLL ne Nachricht schicken mit den Daten. Erst mal weiter machen. Irgendwann schick die DLL eine Nachricht mit dem Ergebnis zurück.

Todd 25. Okt 2007 13:17

Re: Einfrieren des Programms verhindern
 
Danke für eure Hilfe.

Das mit dem Thread finde ich gut. Obwohl ich gar nicht weiß was ein Thread ist und wie ich einen neuen Anlege.

Die .dll läuft autark und hat mit dem eigentlichen Programm nichts weiter zu tun, als dass ihr Werte übergeben werden und nach Beendigung der Rückgabewert an das Programm übergeben wird.

Die Rechenzeit hängt von Nutzer ein, der diese in MIN angibt. Es ist ein sehr aufwendiger Algorithmus, der seine Optimalität dadurch erzielt, je mehr Zeit man ihm zum arbeiten lässt.

Aber zurückzukommen auf das Thema "Thread".

Wie legt man solchen an und was genau ist damit gemeint?

Vielen Dank

Todd

Luckie 25. Okt 2007 13:22

Re: Einfrieren des Programms verhindern
 
Zitat:

Zitat von Todd
Aber zurückzukommen auf das Thema "Thread".

Wie legt man solchen an und was genau ist damit gemeint?

Forensuche hilft: Hier im Forum suchenThreads.

crasher1985 25. Okt 2007 13:35

Re: Einfrieren des Programms verhindern
 
mmhh also ich weiss nicht genau ob es das im Delphi auch gibt aber ähnliches bestimmt.
im C# jedenfalls gibt es seit .Net 2.0 eine Komponente BackroundWorker welche eigentlich das gleiche wie Threads macht dieses aber sehr vereinfacht!

peschai 25. Okt 2007 13:41

Re: Einfrieren des Programms verhindern
 
coole antwort
Zitat:

Das mit dem Thread finde ich gut. Obwohl ich gar nicht weiß was ein Thread ist und wie ich einen neuen Anlege.
:stupid:

Thorben_Ko 25. Okt 2007 14:05

Re: Einfrieren des Programms verhindern
 
Tut

VLl hillft dir das, mir hat es gereicht als basis wissen :D

Thorben

BasicX 25. Okt 2007 14:09

Re: Einfrieren des Programms verhindern
 
Hi,
mir hat diese Tutorial sehr geholfen:
klick

MfG BasicX

Luckie 25. Okt 2007 14:43

Re: Einfrieren des Programms verhindern
 
Dann will ich auch mal Werbung machen: http://www.delphipraxis.net/internal...t.php?t=121360

Todd 25. Okt 2007 15:36

Re: Einfrieren des Programms verhindern
 
Danke für eure Antworten.

Leider bin ich kein Vollzeitprogramierer und habe eigentlich auch keine Zeit mich intensiv mit dem Thema "Threads" auseinander zusetzen. Es scheint nämlich ziemlich umfangreich zu sein.
Da fällt mir das ganz schön schwierig durchzublicken. :wall:

Könnte mir vielleich jemand einige Schritte auf die Schnelle klarmachen was zu tun ist?

Mein Problem: Anwendung bekommt vom Nutzer Daten.
1. Aufruf und Weitergabe der Daten an eine .dll.
2. Nach Rückgabe der Berechnungen -> Ausgabe

Bevor ich die .dll Aufruf muss ich einen neuen Thread erstellen, richtig?
Kann mir vielleicht jemand eine Art CodeSchnipsel bereitstellen.

Danke und liebe Grüße
Todd

wicht 25. Okt 2007 16:27

Re: Einfrieren des Programms verhindern
 
Tach!
Ich haue hier mal was ungetestetes für dich hin:

Delphi-Quellcode:
type
  TMeinThread = class(TThread)
  private
    FParentHandle: hWND;

    procedure Execute; override;
  public
    constructor Create(ParentHandle: hWND);
    destructor Destroy; override;
  end;

implementation

constructor TMeinThread.Create(ParentHandle: hWND);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  FParentHandle := ParentHandle;
  Resume;
end;

procedure TMeinThread.Execute;
var
  AufrufErgebnis: Integer;
begin
  // DLL Aufruf, Krams erledigen, ein Bier trinken oder was auch immer
  SendMessage(ParentHandle, WM_MEINENACHRICHT, AufrufErgebnis, 0);
end;
Diesen Thread kannst du einfach erstellen und er arbeitet dann das Execute ab. Das ist auch das, was "im Thread" läuft. Sonst nichts. Am Ende schickt der Thread eine Nachricht an deine Form (das Handle hast du in ParentHandle dem Thread mitgegeben im Konstruktor).
Die Prozedur in deiner Form sieht dann ungefähr so aus:

Delphi-Quellcode:
procedure ThreadMessage(var Msg: TMessage); message WM_MEINENACHRICHT;
Das Ergebnis des Threads steht dann in Msg.WParam (oder so ähnlich).

Hoffe, das schafft (ein bisschen) Klarheit :) ?

Todd 25. Okt 2007 19:07

Re: Einfrieren des Programms verhindern
 
Vielen lieben Dank.

Das hilft mir sicherlich weiter.
Ich werde mich morgen mal damit beschäftigen uns sehn ob ich es alleine zum laufen bekomme.

Liebe Grüße
Todd


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 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