GUI in einen Thread auslagern

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
mtbf40
Beiträge: 69
Registriert: Do 3. Nov 2011, 16:39

GUI in einen Thread auslagern

Beitrag von mtbf40 »

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?

Benutzeravatar
theo
Beiträge: 8520
Registriert: Mo 11. Sep 2006, 19:01

Re: GUI in einen Thread auslagern

Beitrag von theo »

Warum machst du nicht gleich eine GUI Anwendung?
So ist das doch unnötiger Krampf und auch für den Benutzer ungewohnt.

mtbf40
Beiträge: 69
Registriert: Do 3. Nov 2011, 16:39

Re: GUI in einen Thread auslagern

Beitrag von mtbf40 »

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.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4321
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: GUI in einen Thread auslagern

Beitrag von af0815 »

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.

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mtbf40
Beiträge: 69
Registriert: Do 3. Nov 2011, 16:39

Re: GUI in einen Thread auslagern

Beitrag von mtbf40 »

... und wie?

Benutzeravatar
theo
Beiträge: 8520
Registriert: Mo 11. Sep 2006, 19:01

Re: GUI in einen Thread auslagern

Beitrag von theo »

mtbf40 hat geschrieben:... und wie?

Na eben in der .lpr Datei. (Menu "Projekt" ganz unten).
Dort kann man vor z.B. "Application.Initialize;" machen was man will, bevor ein Formular erstellt wird bzw. die GUI Anwendung gestartet wird.

mschnell
Beiträge: 3411
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

Beitrag von mschnell »

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

Warf
Beiträge: 1506
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: GUI in einen Thread auslagern

Beitrag von Warf »

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)

jus
Beiträge: 47
Registriert: Fr 6. Mai 2011, 13:29

Re: GUI in einen Thread auslagern

Beitrag von jus »

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?

kupferstecher
Beiträge: 274
Registriert: Do 17. Nov 2016, 11:52

Re: GUI in einen Thread auslagern

Beitrag von kupferstecher »

jus 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?

Man kann bei einer GUI-App in die .lpr-Datei ganz am Anfang die Direktive

Code: Alles auswählen

{$APPTYPE CONSOLE}
schreiben. Es bleibt dann trotzdem eine GUI-App, hat aber zusätzlich die Konsolenausgabe. Unter Windows poppt dann auch beim Starten des Programms neben dem Hauptfenster ein Konsolenfenster auf. Unter Linux "verpufft" die Konsolenausgabe, außer man startet das Programm in einer Konsole.
Also ja, geht sogar sehr einfach.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4321
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: GUI in einen Thread auslagern

Beitrag von af0815 »

In der LPR hast am Ende normalerweise so ein Konstrukt

Code: Alles auswählen

begin
  Application.Initialize;
  // <---- hier kann dein NON GUI Code stehen
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.

Du willst am Ende etwas mit GUI machen, dann mache vorher deinen NON GUI Sachen und gut ist es.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten