Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: Programm wärend Prozess steuerbar machen

  Alt 3. Apr 2010, 18:20
Threads laufen immer parallel, außer du hälst einen an und beendest ihn. Eine VCL-Anwendung läuft schon in einem Thread, dem MainThread (weiß gar nicht ob man den wirklich so nennt). Wenn du Berechnungen vornimmst, so kannst du das in einen anderen Thread auslagern, der dann parallel dazu läuft.

Warum kannst du dein Programm eigentlich nicht bewegen, wenn du eine dauerhafte Rechnung (z.B. Berechnung der letzten Stelle von Pi ) in deinem MainThread laufen lässt? Windows verschickt Nachrichten an Anwendungen -- genauer an den MainThread -- u.a. fällt hierbei das Bewegen von Fenster drunter. Wenn dein Programm eigentlich nichts macht, d.h. deinen geschriebenen Code nicht ausführt, so erhält es dennoch (für dich im Hintergrund) diese Nachrichten und zeichnet z.B. die Form neu oder so Sachen. Das funktioniert aber nur, wenn diese Nachrichten auch wirklich verarbeitet werden, was du an sich nicht merkst.

Wenn du aber probierst die letzte Stelle von Pi zu berechnen (was offensichtlich nicht geht), dann kommt dein Programm nicht mehr dazu die Nachrichten abzuarbeiten, da nur diese Berechnung ausgeführt wird. Es kann die eingehenden Nachrichten nicht mehr abarbeiten, da es bis zu dieser Stelle nicht mehr gelangt, es läuft ja nur diese Schleife. Das kannst du mit einem Application.ProcessMessages umgehen, da dieser Befehl dein Programm dazu veranlasst genau diese Nachrichten abzuarbeiten.

Nun hast du eben die genannten Möglichkeiten, entweder Application.ProcessMessages oder Threads. Application.ProcessMessages ist aber langsamer als ein Thread, da ja deine Berechnung auf die Abarbeitung der Nachrichten warten muss und umgekehrt. Hast du nun aber zwei Threads, so umgehst du dieses Problem, d.h. die Berechnung läuft echt parallel (naja, echt eigentlich nur, wenn du mehrere Cores im Rechner hast) zu deiner "Anwendung" -- hier ist der MainThread gemeint! -- der die Windows-Nachrichten verarbeiten kann.

// edit
Nun zu deinem Problem überhaupt Erstelle eine Klasse und leite diese vom Typ TThread ab. Dann überschreibst du die protected-Methode Execute und schreibst dort deinen Code hinein, wie z.B. die obige Berechnung von der letzten Stelle von Pi. Der MainThread existiert ja eh schon mit deiner Anwendung, ergo musst du nur noch diesen instanziieren laufen lassen. Alles weitere solltest du hier im Forum finden. Aber vorsicht, wenn du auf VCL-Objekte etc. zugreifen willst. Diese sind (meist) nicht threadsafe.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat