Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Grundsätzliches internes zu Linux (https://www.delphipraxis.net/206203-grundsaetzliches-internes-zu-linux.html)

t2000 30. Nov 2020 08:34

Grundsätzliches internes zu Linux
 
Hallo Forum,

ich möchte die ersten Dienste für Linux entwickeln. Dazu habe ich ein paar ganz grundsätzliche Fragen um den Übergang von Windows zu schaffen.
Es geht um Message Verarbeitung, Threads usw. Weiteres wird bestimmt folgen.

Ich habe meine Server/Services als Komandozeilen-Programme ausgelegt. So kann ich sie flexibel einsetzen und dachte mir auch, dass es leichter sein wird diese auf andere Platformen zu portieren. Unter Windows habe ich einen Windows-Service, der meinen Kernel-Service kontrolliert und ggf. startet. So, das vorweg.

Problem 1: Messageloop

Ich habe im Prinzip die Messageloop aus der VCL nachgebildet. Darüber kann ich threadübergreifend Nachrichten senden, sychrone und asynchrone Dinge tun.

Wie mache ich das unter Linux?

Hier der Code. "ProcessMessage" wird natürlich in einer Schleife aufgerufen. Die Markierungen mit {!!!} sind wohl erstmal die wichtigen Punkte.

Ich denke, weitere Fragen werden hier in diesen Thema folgen.

Vielen Dank.
VG Thomas

Delphi-Quellcode:
function TServerApp.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
{!!!}  if PeekMessage(Msg, NativeUInt(-1), 0, 0, PM_REMOVE) then begin
    Result := True;

    if Msg.Message <> WM_QUIT then begin
      Handled := False;
      case Msg.Message of
        sms_Processing            : ;
        sms_Quit                  : FCloseTimer.Enabled := true;
        sms_Synchronize           : SyncExecute( Msg.wParam);
        sms_Workerthread          : CreateWorkItem;
      end; // case

      //if Assigned(FOnMessage) then
      //  FOnMessage(Msg, Handled);
      if not Handled then begin
{!!!}        TranslateMessage(Msg);
{!!!}        DispatchMessage(Msg);
      end;
    end else begin
      FTerminate := True;
    end;
  end;
end;

Thomas Horstmann 30. Nov 2020 16:04

AW: Grundsätzliches internes zu Linux
 
Hallo,
wir haben eine Anwendung (Client/Server-DB) von Windows nach Linux portiert. Allerdings haben wir in Windows schon keine Messages verwendet (bis auf TService). Bei uns läuft ein Hauptthread, der ggf. andere Threads anlegt oder direkt ansteuert.

Prozesse können unter Linux per "Signal" untereinander kommunizieren. Über "SIGKILL" und "SIGTERM" kann z.B. in Delphi abgefragt werden, ob der Prozess beendet oder abgebrochen wird.

Um eine Linux Anwendung im Hintergrund laufen zu lassen, muss sie als "Daemon" konfigurieren werden. Diese kann dann in Systemd (Type=forking) eingetragen werden, damit sie beim Start mit hochläuft. Es gibt zwar noch "Initd" und anderes, was aber schon veraltet ist. Das Ganze läuft aber grundsätzlich anders wie unter den Windows Diensten.

t2000 30. Nov 2020 16:31

AW: Grundsätzliches internes zu Linux
 
Danke schon mal. Der Hinweis hat mich zu dieser Seite geführt
http://blog.paolorossi.net/2017/09/0...delphi-part-2/
Ich glaube, damit kommen wir schon mal weiter

Bbommel 30. Nov 2020 16:35

AW: Grundsätzliches internes zu Linux
 
Kann ich bestätigen. Der Artikel von Paolo ist echt super - ich hab mit dessen Hilfe einen Linux-Daemon gebaut, der mittlerweile seit Februar friedlich vor sich hinwerkelt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz