Backgroundworker-Äquivalent
-
- Beiträge: 7
- Registriert: Di 11. Jan 2011, 09:27
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Göppingen
- Kontaktdaten:
Backgroundworker-Äquivalent
Hallo Forum
Lazarus kenne ich seit ca. 10 Minuten und bin bisher von der Beschreibung begeistert. Ich programmiere seit 20 Jahren, so in etwa, zuletzt sehr viel in C#.
Zum Thema:
Ich bin gerade am evaluieren, ob Lazarus geeignet ist, ein Programm von uns von C#/Windows Forms nach Lazarus zu portieren, damit wir Cross-Plattform und .NET-unabhängig werden. (Wen's interessiert, in meinem Profil ist ein Link dazu).
In dem jetzigen Programm verwende ich die BackgroundWorker-Klasse aus dem .NET Framework.
Zu meiner Frage:
Gibt es ein Äquivalent zur BackgroundWorker-Klasse in der Lazarus-API, die ähnlich funktioniert?
Gruß und danke
Uwe
Lazarus kenne ich seit ca. 10 Minuten und bin bisher von der Beschreibung begeistert. Ich programmiere seit 20 Jahren, so in etwa, zuletzt sehr viel in C#.
Zum Thema:
Ich bin gerade am evaluieren, ob Lazarus geeignet ist, ein Programm von uns von C#/Windows Forms nach Lazarus zu portieren, damit wir Cross-Plattform und .NET-unabhängig werden. (Wen's interessiert, in meinem Profil ist ein Link dazu).
In dem jetzigen Programm verwende ich die BackgroundWorker-Klasse aus dem .NET Framework.
Zu meiner Frage:
Gibt es ein Äquivalent zur BackgroundWorker-Klasse in der Lazarus-API, die ähnlich funktioniert?
Gruß und danke
Uwe
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Backgroundworker-Äquivalent
In MSEide+MSEgui (eine andere Free Pascal Entwicklungsumgebung) gibt es zu diesem Zweck tthreadcomp.
http://developer.berlios.de/projects/mseide-msegui/
Lazarus arbeitet so viel ich weiss mit der FPC TThread Klasse.
Martin
http://developer.berlios.de/projects/mseide-msegui/
Lazarus arbeitet so viel ich weiss mit der FPC TThread Klasse.
Martin
-
- Beiträge: 7
- Registriert: Di 11. Jan 2011, 09:27
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Göppingen
- Kontaktdaten:
Re: Backgroundworker-Äquivalent
Danke schön!
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Backgroundworker-Äquivalent
Backgroundworker-Klasse . Hört sich ja mega Bonzig an 
Sieht auf den ersten Blick wie multithearding aus. Also das nutzen von Mehrkernprozessoren.
Ich würde wie mse mir mal die TThread Klasse anschauen. Dürfte gewöhungsbedürftig sein, aber ist machbar.
Es gibt auch ne menge Tutorials dazu, "Lazarus TThread" - "Delphi Multithearding" - und kombination davon einfach mal suchen.
Viel Erfolg.

Sieht auf den ersten Blick wie multithearding aus. Also das nutzen von Mehrkernprozessoren.
Ich würde wie mse mir mal die TThread Klasse anschauen. Dürfte gewöhungsbedürftig sein, aber ist machbar.
Es gibt auch ne menge Tutorials dazu, "Lazarus TThread" - "Delphi Multithearding" - und kombination davon einfach mal suchen.
Viel Erfolg.
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 7
- Registriert: Di 11. Jan 2011, 09:27
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Göppingen
- Kontaktdaten:
Re: Backgroundworker-Äquivalent
Danke, MAC
Die BackgroundWorker-Klasse ist eine High-level-Kapselung eines Hintergrund-Threads. Automatisch mit GUI-Benachrichtigungen und Ereignismethoden bei Beginn/Ende.
Also quasi ein gekapselter TThread.
Die BackgroundWorker-Klasse ist eine High-level-Kapselung eines Hintergrund-Threads. Automatisch mit GUI-Benachrichtigungen und Ereignismethoden bei Beginn/Ende.
Also quasi ein gekapselter TThread.
-
- 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: Backgroundworker-Äquivalent
Die GUI-Benachrichtigung geht mit Delphi (von dem Lazarus viel geerbt hat) recht einfach mittelsUweKeim hat geschrieben:Also quasi ein gekapselter TThread.
- TThreadSynchronize (oft nicht brauchbar, weil es den Thread für unbestimmte Zeit anhält),
- TThread.Queue,
- PostThreadMessage / procedure ... message()
Leider ist das in Lazarus auf Linux nicht ordentlich implementiert
- TThreadSynchronize: ich habe gehört, dass es nicht ordentlich funktioniert, wenn viel Vorgänge in kurzer Zeit bearbeitet werden sollen
- TThread.Queue: ist überhaupt nicht implementiert
- Post(Thread)Message / procedure ... message(): hat früher 'mal funktioniert (möglicherweise immer noch in der "offiziellen" Version). In der aktuelle Version im Subversion-Tree funktioniert es nicht.
Wenn Du Werte vom Thread an den GUI-Mainthread übergeben willst, geht das recht schön mit TThredList:
Im Thread:
- TThreadlist.Add um einen Datensatz zu schreiben
- TThread.Queue (oder was auch immer, musst Du nur erst in der LCL in Funktion setzen, fallst Du Linux verwenden willst) um den Mainthread aufzuwecken
Im Maintread-Event-Handler:
- in einer Schleife alle Elemente der Threadliste bearbeiten und löschen
Damit kannst Du Dir eine "TBackgroundWorker" Klasse bauen.
-Michael
Zuletzt geändert von mschnell am Mi 12. Jan 2011, 15:30, insgesamt 1-mal geändert.
-
- Beiträge: 7
- Registriert: Di 11. Jan 2011, 09:27
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Göppingen
- Kontaktdaten:
Re: Backgroundworker-Äquivalent
Super-ausführliche Antwort, herzlichen Dank, Michael, ich werde das ausprobieren!
Klingt so, als sei es mit der tatsächlichen Plattform-übergreifenden Funktionalität doch nicht so weit her?
Ich will Lazarus primär dazu verwenden, das Programm auf Win, Mac, Linux zum Laufen zu bekommen. Rätst Du mir davon eher ab? Hast Du ggf. Alternativvorschläge?
Klingt so, als sei es mit der tatsächlichen Plattform-übergreifenden Funktionalität doch nicht so weit her?
Ich will Lazarus primär dazu verwenden, das Programm auf Win, Mac, Linux zum Laufen zu bekommen. Rätst Du mir davon eher ab? Hast Du ggf. Alternativvorschläge?
Re: Backgroundworker-Äquivalent
Mschnell neigt dazu, alles bis zur Unbrauchbarkeit kompliziert zu erklären, manchmal auch falsch oder vom "hörensagen"UweKeim hat geschrieben:Super-ausführliche Antwort, herzlichen Dank, Michael, ich werde das ausprobieren!
Klingt so, als sei es mit der tatsächlichen Plattform-übergreifenden Funktionalität doch nicht so weit her?

Erklär doch mal konkret, was du in den "Background" legen musst, dann kann man das besser beurteilen.
Oder lies hier:
http://wiki.lazarus.freepascal.org/Mult ... utorial/de" onclick="window.open(this.href);return false;
-
- Beiträge: 7
- Registriert: Di 11. Jan 2011, 09:27
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Göppingen
- Kontaktdaten:
Re: Backgroundworker-Äquivalent
Dank schee, Theo
Ganz konkret will ich die Windows-Version die es auf dieser Website von mir gibt neu schreiben. Zurzeit .NET, ziel, nativ Windows.
Es gibt einen Upload-Dialog mit Fortschrittsbalken, der im Hintergrund via SOAP Daten schaufelt.
Und eben dieses Hintergrund-Datenschaufeln muss regelmäßig an die GUI Statusmeldungen geben. Das habe ich bisher mit dem BackgroundWorker umgesetzt.
Ganz konkret will ich die Windows-Version die es auf dieser Website von mir gibt neu schreiben. Zurzeit .NET, ziel, nativ Windows.
Es gibt einen Upload-Dialog mit Fortschrittsbalken, der im Hintergrund via SOAP Daten schaufelt.
Und eben dieses Hintergrund-Datenschaufeln muss regelmäßig an die GUI Statusmeldungen geben. Das habe ich bisher mit dem BackgroundWorker umgesetzt.
Re: Backgroundworker-Äquivalent
Ja, dann kannst du dich einfach an das Beispiel hier halten:
http://wiki.lazarus.freepascal.org/Mult ... utorial/de" onclick="window.open(this.href);return false;
Statusmeldungen werden getriggert in :
Synchronize(@Showstatus);
http://wiki.lazarus.freepascal.org/Mult ... utorial/de" onclick="window.open(this.href);return false;
Statusmeldungen werden getriggert in :
Synchronize(@Showstatus);
-
- 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: Backgroundworker-Äquivalent
Bugs gibt es Immer.UweKeim hat geschrieben:Klingt so, als sei es mit der tatsächlichen Plattform-übergreifenden Funktionalität doch nicht so weit her?
Von Lazarus gibt schließlich noch nicht einmal eine 1.0 Version. Trotzdem ist vieles brauchbar. Wenn etwas nicht funktioniert hat man bei Open Source schließlich die Chance es zu debuggen an's funktionieren zu bringen !
Nein, wie gesagt, mit einer IDE in <1.0 Version musst Du natürlich mit Unzulänglichkeiten rechnen, die Du selber ausbügeln musst (und Dir dabei jede Menge Open-Source-Ehren erwerben kannst).UweKeim hat geschrieben:Rätst Du mir davon eher ab?
Eine "kommerzielle" Optionen ist Delphi Prism (unterstützt offiziell: Windows (.NET) natürlich

-Michael
-
- Beiträge: 7
- Registriert: Di 11. Jan 2011, 09:27
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Göppingen
- Kontaktdaten:
Re: Backgroundworker-Äquivalent
Herzlichen Dank an Euch alle für Eure Antworten. Coole Community 

-
- 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: Backgroundworker-Äquivalent
Weitere infos
:
TThread.Queue ist zwar nicht implementiert, dafür aber TApplication.QueueAsyncCall.
Wenn Du Daten übertragen willst, brauchst Du noch nicht einmal TThreadList
.
Application.QueueAsyncCall(@SimpleMethod, 2); überträgt keine Daten
Das macht genau dasselbe und mehr. (Warum keiner TThread.Queue, was also ein Dreizeiler wäre, implementiert, weis ich nicht.
Also los geht's ! Wir warten gespannt auf Deine TBackgroundWorker Komponente
-Michael

TThread.Queue ist zwar nicht implementiert, dafür aber TApplication.QueueAsyncCall.
Wenn Du Daten übertragen willst, brauchst Du noch nicht einmal TThreadList

Code: Alles auswählen
type
TMyData = record
S: string;
data: longint;
end;
PMyData = ^TMyData;
var
MyData: PMyData;
new(MyData);
MyData^.data:=1;
MyData^.S:= 'QueueAsyncCall call';
Application.QueueAsyncCall(@ComplexMethod, PtrInt(MyData));
Das macht genau dasselbe und mehr. (Warum keiner TThread.Queue, was also ein Dreizeiler wäre, implementiert, weis ich nicht.
Also los geht's ! Wir warten gespannt auf Deine TBackgroundWorker Komponente

-Michael
-
- 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: Backgroundworker-Äquivalent
Noch ein Update:
Bei der neusten svn Version von Lazarus mit gtk2 Widget Type funktioniert PostMessage() wieder.
Dafür funktioniert jetzt TThread.Synchronize gar nicht mehr vernünftig. Daran wird aber wohl gearbeitet.
-Michael
Bei der neusten svn Version von Lazarus mit gtk2 Widget Type funktioniert PostMessage() wieder.
Dafür funktioniert jetzt TThread.Synchronize gar nicht mehr vernünftig. Daran wird aber wohl gearbeitet.
-Michael
-
- Beiträge: 7
- Registriert: Di 11. Jan 2011, 09:27
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Göppingen
- Kontaktdaten:
Re: Backgroundworker-Äquivalent
Danke, Michael.