Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Endlosschleife + WarteFunktion ohne Programm zu blockieren (https://www.delphipraxis.net/105185-endlosschleife-wartefunktion-ohne-programm-zu-blockieren.html)

.chicken 17. Dez 2007 18:46

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
WEiss ich nicht genau, aber ist ja egal ich habe hier im Forum zwei Tutorials gefunden. Aber das ist ja meeeeega umfangreich!? o.O
Das wird ja ne heidenArbeit isch da durchzuforsten!

sirius 17. Dez 2007 18:54

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Nee, wieso.
1. Ansatz ist einfach eine Klasse von TThread ableiten und dann die Execute-Methode überschreiben. Und darin legst du den Code des Threads. Fertig. Musst natürlich beachten, dass du jetzt nicht einfach so kreuz und quer auf Variablen zugreifen kannst.

.chicken 17. Dez 2007 19:13

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Ich hab diesen Wälzer gefunden ^^
http://www.michael-puff.de/Developer...mit_Delphi.pdf
Habe mich shcon bisl durchgeforstet aber ist für imch nicht so einfach zu verstehen. Habe aber nun schon ein grobes Verständnis was passiert und was nicht passieren sollte ^^

Wenn ich jetzt noch ein simples Tut hätte, dass sich nur damit beschäftigt wie man das benutzt, dann würd das sicher was werden ^^

Edit: Achso, dann lager ich am besten meine Endlosschleife in einen Thread aus und die verarbeitung der nodeNames oder? Weil ich da dann ja noch die Wartezeit mit dem Thread erledigen könnte!?

Zacherl 17. Dez 2007 19:25

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Benutze doch einfach CreateThread oder BeginThread :P Dann kannst du in deinem Thread die Arbeiten durchführen und dein Programm friert trotzdem nichtein.

.chicken 17. Dez 2007 19:30

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Zitat:

Zitat von Zacherl
Benutze doch einfach CreateThread oder BeginThread :P Dann kannst du in deinem Thread die Arbeiten durchführen und dein Programm friert trotzdem nichtein.

Da wurschtel ich mich doch grade durch Meister ^^
Danke trotzdem ;-)

.chicken 18. Dez 2007 20:26

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, ich raff das mit den Threads einfach noch nicht. Ich würde mich sehr freuen, wenn ihr euch mal meine Unit ansehen würdet und mir ein paar Anstöße geben könntet! Möchte keinen vollständigen Code, denn ich möchte verstehen was ich tue ;-)

So, ich weiss einfach nicht wie ich da die Threads einbaun soll. Soll ich beim DialogStart einen Thread erstellen, der dann ProfceedDialog aufruft? Wie mache ich das? Hierbei sagt er mir immer
Delphi-Quellcode:
BeginThread(nil, 0, TFNThreadStartRoutine(@ProceedDialog), nil, 0, ThreadID);
"Variable Required udn zeigt auf das @ProceedDialog.

Ich habe keinen Plan wie ich das nun realisieren soll, und die Parameter der BeginThread Funktion verstehe ich auch nicht so recht, bin aus den Tut Beschreibungen net recht schlau geworden!

Edit: Achso, hilfreich wäre vielleicht zu wissen, dass das ganze als DialogSystem in einem Adventure genutzt werden soll!

peschai 19. Dez 2007 07:12

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Hallo,
Um auf das eigentliche Problem zurückzukommen:
Wenn du ein OnPaint provozieren möchtest, so rufe auf:
Delphi-Quellcode:
<Komponente>.Invalidate
Damit wird das Betriebssystem bei der nächsten Gelegenheit ein repaint veranlassen ...

sirius 19. Dez 2007 08:40

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
ProceedDialog muss eine Funktion sein mit folgender Deklaration:
Delphi-Quellcode:
function ProceedDialog(param:pointer):integer;
Beachte, dass dies keine Methode ist, also nicht innerhalb einer Klasse sein darf.

Ausserdem darfst du in einem Thread nicht auf globale Variablen zugreifen, bzw. auf Variablen, die auch der Main-Thread gleichzeitig benutzen könnte. Wenn dies zwingend notwendig wird, muss man eben synchronisieren.

Du benutzt jetzt BeginThread. Warum nimmst du nicht eine Ableitung der Klasse TThread? Das ist für den Anfang viel einfacher. Vor allem sind die Änderungen, die du machn müsstest überschaubarer, wenn du die Klasse TDialogclass von TThread ableitest.

.chicken 19. Dez 2007 10:57

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Ok, danke euch beiden!
Sirius, kannst du das etwas genauer erklären? Also ich leite die DialogUnit von TThread ab...sobald sie erzeugt wird ist das dann ein eigener Thread? Dann muss ich aber trotzdem noch mit den Variablen aufpassen oder? Also habe was von Critical Sections gelesen, das müsste sich dafür doch eignen oder?

D.h. die einzige Änderung die ich machen müsste, wäre die Klasse von TThread abzuleiten und dann kann ich quasi alles so lassen, abgesehn davon dass ich mit den globalen Variablen aufpassen muss?

sirius 19. Dez 2007 11:02

Re: Endlosschleife + WarteFunktion ohne Programm zu blockier
 
Liste der Anhänge anzeigen (Anzahl: 1)
Fast. Ich sehe halt den Rest des Programms nicht (besonders, wann du Methoden/Eigenschaften von der Klasse verwendest). Und kann nicht sagen, ob es alles ist.
Und zudem musst du dann die Execute-Methode anlegen/überschreiben. Die wird nämlich ausgeführt.
Alle Parameter die du brauchst übergibst du im Constructor. Wenn du nachher noch Werte zwischen den Threads austauschen willst, dann würde ich dir erstmal zu "synchronize" raten (ist für den Anfang am einfachsten und dürfte bei dir auch ausreichen; da brauchst du dich mit CriticalSections noch nicht zu beschäftigen). Kann ich dir besser an einem Beispiel erklären, wenn du eins hast.

Edit: Anhang angefügt
Ich habe mal die Änderungen, die ich jetzt gesehen habe gemacht. Ob das jetzt alles richtig ist, weis ich nicht, da ich den Rest des Programmes nicht kenne.
GEdacht ist es jetzt so, dass du das Objekt instanzierst und damit läuft der Thread gleich los (außer die Exception wird geworfen)und ruft irgendwann mal das TOnChange-Ereignis auf. Und genau darin bzw. nur darin darfst du dir den vollen Zugriff auf dein Objekt erlauben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Seite 2 von 4     12 34      

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