![]() |
Programm wärend Prozess steuerbar machen
Hi und zwar habe ich gelesen, das es geht, das ein Programm, wärend es gerade am arbeiten ist trotzdem zu steuern ist.
Sprich da sman es verschieben, minimieren etc. kann. Jetzt habe ich mal gesucht finde aber nichts. Habe diverse suchbegrife probiert jedoch ohne erfolg. Jetzt wollte ich mal hier nach fragen, ob ihr mir helfen könnt. |
Re: Programm wärend Prozess steuerbar machen
Ich weiß nicht ob du das meinst, aber bau während dein Programm irgendne Schleife durchwandert oder so
Delphi-Quellcode:
ein.
Application.ProcessMessages;
Dadurch reagiert es z.B. auf Klicks aufs MainMenu o.Ä. |
Re: Programm wärend Prozess steuerbar machen
Oder Threads.
|
Re: Programm wärend Prozess steuerbar machen
Wenn man etwas mehr Erfahrung mit der Programmierung hat, dann würde ich klar zu Threads tendieren, da diese imho mächtiger sind also dieses Application.ProcessMessages. Ebenso wird das Programm dadruch eher effizienter (was bei ungeschickter Programmierung natürlich nicht sein muss :stupid: )
Aber: Mit Threads kann man sich einige Probleme einfangen und sie sind noch lange nicht so einfach zu verwenden wie Application.ProcessMessages. :mrgreen: |
Re: Programm wärend Prozess steuerbar machen
Ok ich hab mir jetzt einmal ein wenig zu Thread durchgelesen.
Das Prinzip solcher ist klar. Nur die Anwendung nicht. Ich stelle mir das so vor: Als Primärer Thread steht nun das sich das fenster immer bewegen lassen kann. Und als Sekundärer Thread ständ dann mein ganzer anderer Quellcode. Solange ich das Fenster nicht bewege arbeitet es alles andere durch, doch sobald ich mein fester bewegen will, stoppt der rest, sodass ich das fenster bewegn kann. Stimmt das so? |
Re: Programm wärend Prozess steuerbar machen
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 :mrgreen: ) 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 :mrgreen: 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. |
Re: Programm wärend Prozess steuerbar machen
Dann natürlich eine Message an das zu steuernde Programm senden. Zum Beispiel WM_COPYDATA.
Als Daten müsste dann das Kommando für die beabsichtigte Aktion gesendet werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 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