GUI in einen Thread auslagern
GUI in einen Thread auslagern
Hallo,
habe wiedermal ein Problem bei dem ich nicht weiterkomme.
Ich habe eine Konsole Applikation die irgendwann eine GUI (blinkendes Label) aufrufen soll. Dies will ich über einen Thread realisieren.
d.h. die Konsole Applikation soll weiterlaufen - in diesem Fall werden Files kopiert und die GUI (Label) soll - in einem Thread - blinken.
Wenn das kopieren fertig ist soll der Thread beendet werden.
Die GUI liegt in einer separaten Unit.
Wie muss ich so etwas aufbauen?
habe wiedermal ein Problem bei dem ich nicht weiterkomme.
Ich habe eine Konsole Applikation die irgendwann eine GUI (blinkendes Label) aufrufen soll. Dies will ich über einen Thread realisieren.
d.h. die Konsole Applikation soll weiterlaufen - in diesem Fall werden Files kopiert und die GUI (Label) soll - in einem Thread - blinken.
Wenn das kopieren fertig ist soll der Thread beendet werden.
Die GUI liegt in einer separaten Unit.
Wie muss ich so etwas aufbauen?
Re: GUI in einen Thread auslagern
Warum machst du nicht gleich eine GUI Anwendung?
So ist das doch unnötiger Krampf und auch für den Benutzer ungewohnt.
So ist das doch unnötiger Krampf und auch für den Benutzer ungewohnt.
Re: GUI in einen Thread auslagern
es ist ja eigentlich nur eine Konsole Applikation - wobei die Konsole auch hidden ist, weil keine Ausgaben gemacht werden. Die GUI - ausgelagert als Thread - dient nur als Anzeige das im Moment Daten kopiert werden.
Die Konsole Applikation ist auch nur ein Wrapper für eine proprietäre Software - der Wrapper wartet auf die Beendigung des Hauptprogramms (macht auch vorher noch was) und startet dann das kopieren der Daten... und für diesen Zweck wollte ich die GUI anzeigen lassen um darauf hinzuweisen das gerade Files kopiert werden - damit der User sieht - aha hier passiert noch was.
Klar ich kann natürlich auch eine GUI-Applikation bauen, lasse diese nach dem Start verschwinden und nachdem das Hauptprogramm beendet wurde hole ich sie aus dem Winterschlaf hervor und pinsel die zu kopierenden Files in ein Memo.
Dann sieht der User auch das was passiert.
Die Konsole Applikation ist auch nur ein Wrapper für eine proprietäre Software - der Wrapper wartet auf die Beendigung des Hauptprogramms (macht auch vorher noch was) und startet dann das kopieren der Daten... und für diesen Zweck wollte ich die GUI anzeigen lassen um darauf hinzuweisen das gerade Files kopiert werden - damit der User sieht - aha hier passiert noch was.
Klar ich kann natürlich auch eine GUI-Applikation bauen, lasse diese nach dem Start verschwinden und nachdem das Hauptprogramm beendet wurde hole ich sie aus dem Winterschlaf hervor und pinsel die zu kopierenden Files in ein Memo.
Dann sieht der User auch das was passiert.
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: GUI in einen Thread auslagern
Du musst ja nicht nicht das Hauptfenster verschwinden lassen, sonern du kannst es ja auch später erst erzeugen. In der .lpr hast du ja die Möglichkeit dazu vor dem Erzeugen der MainForm etwas laufen zu lassen.mtbf40 hat geschrieben:Klar ich kann natürlich auch eine GUI-Applikation bauen, lasse diese nach dem Start verschwinden und nachdem das Hauptprogramm beendet wurde hole ich sie aus dem Winterschlaf hervor und pinsel die zu kopierenden Files in ein Memo.
Dann sieht der User auch das was passiert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: GUI in einen Thread auslagern
... und wie?
Re: GUI in einen Thread auslagern
Na eben in der .lpr Datei. (Menu "Projekt" ganz unten).mtbf40 hat geschrieben:... und wie?
Dort kann man vor z.B. "Application.Initialize;" machen was man will, bevor ein Formular erstellt wird bzw. die GUI Anwendung gestartet wird.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: GUI in einen Thread auslagern
Es ist absolut unmöglich, in einem "Worker" - Thread GUI Funktionalität zu realisieren. Das geht nur im Mainthread.
Wenn ein Programm verschiedene Threads für GUI und "Business-Logik" verwenden will, müssen die Funktionalitäten in Threads ausgelagert werden. Die GUI und auch TTimer, Messages, und einige weitere Funktionalitäten sind durch die Lazarus-Infrastrukltur fest an den Mainthread gebunden. Das gilt sowohl für Windows als für Linux und Mac.
Wenn es aber - wie ich vermute - gar nicht um Threads, sondern um Units geht, gibt es diverse Möglichkeiten, GUI und "Business-Logik" zu trennen (z.B. um die Business-Logik - Units sowohl in ein Projekt mit GUI, als auch in ein Kommandozeilen-Projekt einzubinden). Dafür müssen die Busines-Logik-Objekte "lediglich" mit den entsprechenden Funktionen, Properties, Callbacks, ... ausgestattet werden, dass sie komplett von außen gesteuert werden können. Wenn diese Objekte irgendeine Art von Timing machen sollen, oder auf irgendetwas warten sollen, müssen sie Callbacks aufrufen, die dann von den "Main" Objekten in den "Main" Units realisiert werden.
-Michael
Wenn ein Programm verschiedene Threads für GUI und "Business-Logik" verwenden will, müssen die Funktionalitäten in Threads ausgelagert werden. Die GUI und auch TTimer, Messages, und einige weitere Funktionalitäten sind durch die Lazarus-Infrastrukltur fest an den Mainthread gebunden. Das gilt sowohl für Windows als für Linux und Mac.
Wenn es aber - wie ich vermute - gar nicht um Threads, sondern um Units geht, gibt es diverse Möglichkeiten, GUI und "Business-Logik" zu trennen (z.B. um die Business-Logik - Units sowohl in ein Projekt mit GUI, als auch in ein Kommandozeilen-Projekt einzubinden). Dafür müssen die Busines-Logik-Objekte "lediglich" mit den entsprechenden Funktionen, Properties, Callbacks, ... ausgestattet werden, dass sie komplett von außen gesteuert werden können. Wenn diese Objekte irgendeine Art von Timing machen sollen, oder auf irgendetwas warten sollen, müssen sie Callbacks aufrufen, die dann von den "Main" Objekten in den "Main" Units realisiert werden.
-Michael
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: GUI in einen Thread auslagern
Wie mschnell geschrieben hat kannst du keine GUI's in threads erzeugen, zumindest nicht mit der LCL (nichts hält dich davon ab die API funktionen direkt aufzurufen).
Was du aber machen könntest ist einfach die GUI als separates programm zu haben was gestartet wird, was dann mit dem Konsolenprogramm kommuniziert (z.B. über einen TSimpleIPCClient)
Was du aber machen könntest ist einfach die GUI als separates programm zu haben was gestartet wird, was dann mit dem Konsolenprogramm kommuniziert (z.B. über einen TSimpleIPCClient)
Re: GUI in einen Thread auslagern
Hallo,
ich hätte dazu auch eine Frage, und zwar habe ich es bisher so verstanden, dass man entweder eine Konsolen App macht oder eine GUI App erstellt. Kann man es überhaupt mischen? Wenn man in diesem Fall eine "blinkendes Label" machen will muss man sich doch für eine GUI App entscheiden oder?
ich hätte dazu auch eine Frage, und zwar habe ich es bisher so verstanden, dass man entweder eine Konsolen App macht oder eine GUI App erstellt. Kann man es überhaupt mischen? Wenn man in diesem Fall eine "blinkendes Label" machen will muss man sich doch für eine GUI App entscheiden oder?
- kupferstecher
- Beiträge: 431
- Registriert: Do 17. Nov 2016, 11:52
Re: GUI in einen Thread auslagern
Man kann bei einer GUI-App in die .lpr-Datei ganz am Anfang die Direktivejus hat geschrieben:Hallo,
ich hätte dazu auch eine Frage, und zwar habe ich es bisher so verstanden, dass man entweder eine Konsolen App macht oder eine GUI App erstellt. Kann man es überhaupt mischen? Wenn man in diesem Fall eine "blinkendes Label" machen will muss man sich doch für eine GUI App entscheiden oder?
Code: Alles auswählen
{$APPTYPE CONSOLE}
Also ja, geht sogar sehr einfach.
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: GUI in einen Thread auslagern
In der LPR hast am Ende normalerweise so ein Konstrukt
Du willst am Ende etwas mit GUI machen, dann mache vorher deinen NON GUI Sachen und gut ist es.
Code: Alles auswählen
begin
Application.Initialize;
// <---- hier kann dein NON GUI Code stehen
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).