mse-Comm

Forum für alles rund um die MSEide und MSEgui
Antworten
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

mse-Comm

Beitrag von mschnell »

Hi Martin,

Kannst Du Unterschiede und Gemeinsamkeiten zwischen mse-Comm und AsyncPro erläutern ?

Wenn ich das richtig sehe ist bei beiden die Grund-Idee gemeinsam:
- eine Objekt pro serielle Schnittstelle zu instanziieren
- jede Instanz erzeugt sich einen oder mehrere Threads zur "blocking" Kommunikation mit dem Treiber des Serien-Ports
- die Schnittstelle der Instanz Richtung User findet im Kontext des Mainthreads (mit zwischengepufferten Daten) statt, so dass das Hauptprogramm sich um Threads nicht kümmern muss.

Bei AsyncPro kann man statt serieller Schnittstelle mit demselben User-Interface auch TCP-Ports behandeln. Das finde ich ziemlich genial ! Man könnte das vermutlich problemlos auch noch für Pipes erweitern !

Gibt es irgendein prinzipielles Problem, mse-Comm in einem Lazarus Projekt zu benutzen ?

Wäre es sinnvoll, mse-Com in ein Lazarus-Paket einzubetten, das sich (wie AnsycPro in Delphi) auch "grafisch platzieren" lässt ?

Gruß und Dank,
-Michael

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: mse-Comm

Beitrag von mse »

Ich kenne AsyncPro nicht genau, die Produkte scheinen vergleichbar.
Die MSEgui comm Komponenten bestehen aus den älteren tcommport und den abgeleiteten Komponenten tasciicommport und tasciiprotport. tcommport arbeitet direkt auf den seriellen Port und hat Methoden zur Busrichtungssteurung und Protokollabwicklung, welche beispielsweise zur Kommunikation mit RS485 Bussen verwendet werden kann.
Zur asynchronen Datenübertragung werden tcommevent und Nachkommen verwendet.

Code: Alles auswählen

tcommevent = class(tmseevent)
  private
   fstate: commstatety;
   fpersistent: boolean;
   fsem: semty;
  protected
   procedure process(const thread: tcommthread; var ok: boolean); virtual;
   procedure processed(const thread: tcommthread; var ok: boolean); virtual;
  public
   onerror: commeventty;   //synchronized with maineventloop
   onsuccess: commeventty; //synchronized with maineventloop
   timeout: integer; //us
   constructor create(persistent: boolean; atimeout: integer = 200000); virtual;
   destructor destroy; override;
   function state: commstatety;
   function waitfordata: boolean; //true if no error
 end;
 
 tasciicommevent = class(tcommevent)
  protected
   procedure process(const thread: tcommthread; var ok: boolean); override;
  public
   commandstring: string;
   resultstring: string;
   resultcode: integer; //cpf_...
 end;

Diese event Objekte werden in die event queue des separaten Kommunikations-threads gespiesen und der Reihe nach abgearbeitet. onerror und onsuccess sind callbacks welche mit dem main thread synchronisiert werden.
tasciicommport und tasciiprotport sind spezialisierte Ableitungen zur Abwicklung von ASCII-Protokollen.

Für einfachere Anwendungen kann die neuere tsercommcomp verwendet werden. tsercommcomp beruht auf tpipereader, welche, wie der Name schon sagt, auch mit pipes funktioniert. Wird MSEide mit -dmse_with_ifirem kompiliert, kann mit den verschiedenen socket Komponenten auch via TCP/IP gearbeitet werden.
Gibt es irgendein prinzipielles Problem, mse-Comm in einem Lazarus Projekt zu benutzen ?

Man müsste die in MSEgui vorhandene locking-, synchronisations-, und event queue Funktionalität nachrüsten. Du hast ja bereits Erfahrung damit.
Wäre es sinnvoll, mse-Com in ein Lazarus-Paket einzubetten, das sich (wie AnsycPro in Delphi) auch "grafisch platzieren" lässt ?

Ich denke schon, das habe ich ja für MSEide auch gemacht.

Martin

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: mse-Comm

Beitrag von mschnell »

mse hat geschrieben:Man müsste die in MSEgui vorhandene locking-, synchronisations-, und event queue Funktionalität nachrüsten. Du hast ja bereits Erfahrung damit.

Ja. Das ist nicht so einfach :oops: . Ich hätte das gebraucht, weil Lazarus nur ein Event-Handling zur Verfügung stellt, wenn auch eine GUI angebunden ist. Mse kann das auch ohne GUI.

Bei dem hier diskutierten Fall ist eine GUI aber (für 99,9% der Anwender = alle außer mir) nicht verboten. Deshalb ist der naheliegende Weg, im mse-Comm Sourcecode den mse-typischen Mechanismus durch den Lazarus-Mechanismus zu ersetzen. Lazarus bietet dafür "TAppplication.QueueAsyncCall()". Funktioniert einwandfrei unter Windows und Linux ("GTK2"-Widget-Type). Mac habe ich nicht getestet.

Lets get it on :D !

-Michael
Zuletzt geändert von mschnell am Mo 13. Feb 2012, 12:31, insgesamt 1-mal geändert.

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: mse-Comm

Beitrag von mse »

Ein weiter Punkt den die MSEgui Komponenten mit threads benötigen und den Lazarus so viel ich weiss nicht zur Verfügung stellt ist application.lock()/unlock(). Dies wird anstelle von synchronize() verwendet. Will man in einem thread Hauptprogramm-Resourcen verwenden, ruft man application.lock() auf. Danach hat man die Resourcen des Hauptprogram reserviert und kann frei darauf zugreifen.
Hinter application.lock()/unlock() liegt eine komplizierte Maschine, welche möglicherweise nicht so ganz einfach auf Lazarus übertragbar ist.

Martin

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: mse-Comm

Beitrag von mschnell »

1) Warum wird das gebraucht ?
2) was ist gegen TCriticalSection für diesen Zweck einzuwenden ? Natürlich müssen sind dafür die Ressourcen, die geschützt werden sollen, bekannt sein. Das macht die Performace aber eher besser, da man jede Ressource einzeln schützen kann.

-Michael

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: mse-Comm

Beitrag von mse »

mschnell hat geschrieben:1) Warum wird das gebraucht ?

Zur Vermeidung von deadlocks, denke nur an thread terminate()/waitfor().
2) was ist gegen TCriticalSection für diesen Zweck einzuwenden ? Natürlich müssen sind dafür die Ressourcen, die geschützt werden sollen, bekannt sein. Das macht die Performace aber eher besser, da man jede Ressource einzeln schützen kann.

MSEgui benutzt ebenfalls MUTEX. Das einzelne Schützen von Ressourcen verlangt vom Anwender einiges an Disziplin und kann von den Bibliotheksroutinen für callbacks (event method properties) nicht automatisch sichergestellt werden. Beim Zugriff auf GUI-Elemente ist vom Anwedner kaum überblickbar, was da alles zusammenhängt. Auf jeden Fall muss der main thread in einem sicheren Zustand sein und bleiben.

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: mse-Comm

Beitrag von mschnell »

Ich hoffe, die kritischen Thread-Protections können komplett innerhalb der Serien-Komponente stattfinden (wie bei AsyncPro, das nur Mainthread-Events exportitert) und die Threads komplett innerhalb der Komponente bleiben. Dann sollte TCriticalSection als Semaphore ausreichen.

-Michael

Antworten