Backgroundworker-Äquivalent

Rund um die LCL und andere Komponenten
Antworten
UweKeim
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

Beitrag von UweKeim »

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

mse
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

Beitrag von mse »

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

UweKeim
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

Beitrag von UweKeim »

Danke schön!

MAC
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

Beitrag von MAC »

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.

Code: Alles auswählen

Signatur := nil;

UweKeim
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

Beitrag von UweKeim »

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.

mschnell
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

Beitrag von mschnell »

UweKeim hat geschrieben:Also quasi ein gekapselter TThread.
Die GUI-Benachrichtigung geht mit Delphi (von dem Lazarus viel geerbt hat) recht einfach mittels
- 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.

UweKeim
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

Beitrag von UweKeim »

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?

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

Re: Backgroundworker-Äquivalent

Beitrag von theo »

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?
Mschnell neigt dazu, alles bis zur Unbrauchbarkeit kompliziert zu erklären, manchmal auch falsch oder vom "hörensagen" ;-)

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;

UweKeim
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

Beitrag von UweKeim »

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.

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

Re: Backgroundworker-Äquivalent

Beitrag von theo »

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);

mschnell
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

Beitrag von mschnell »

UweKeim hat geschrieben:Klingt so, als sei es mit der tatsächlichen Plattform-übergreifenden Funktionalität doch nicht so weit her?
Bugs gibt es Immer.
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 !
UweKeim hat geschrieben:Rätst Du mir davon eher ab?
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).
Eine "kommerzielle" Optionen ist Delphi Prism (unterstützt offiziell: Windows (.NET) natürlich :-) - Mono (Linux) - Silverlight (Browser auf Windows ) - Moonlight (Browser auf Linux) - MonoTouch (keine Ahnung, was das ist) - MonoDroid (Android) - Cocoa Touch (Mac und iPhone), aktuelles siehe z.B. http://www.dsconf.com/agenda" onclick="window.open(this.href);return false; ) Deinen Delphi Source-Code zu Prism portieren ist aber sicher auch ein nicht unerheblicher Aufwand.
-Michael

UweKeim
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

Beitrag von UweKeim »

Herzlichen Dank an Euch alle für Eure Antworten. Coole Community :-)

mschnell
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

Beitrag von mschnell »

Weitere infos :D :

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));
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 :lol:

-Michael

mschnell
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

Beitrag von mschnell »

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

UweKeim
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

Beitrag von UweKeim »

Danke, Michael.

Antworten