Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ereignisse in der Konsole (https://www.delphipraxis.net/111967-ereignisse-der-konsole.html)

Tumm 12. Apr 2008 12:05


Ereignisse in der Konsole
 
Hi,

ich hab ein Problem :(. Und zwar habe ich ein Serverprogramm mit TServerSocket für ein Projekt geschrieben. Macht ja auch keinerlei Probleme. Nachdem ich dann alles fertig hatte, habe ich probiert das Programm auszuführen. Ging auch, aber die Ereignisse vom TServerSocket wurden nicht aufgerufen. Also hab ich die Endlosschleife von voher
Delphi-Quellcode:
while true do sleep(1);
durch
Delphi-Quellcode:
while true do application.proccesmessages;
ersetzt. Über die DP-Suche bin ich dann noch auf Delay gestoßen und hab die Funktion auch eingebunden. Unter Windows funktioniert es jetzt auch :). Das Problem ist bloß, dass ich dieses Programm auf einem Linux-Server zum Laufen bringen muss. WINE kann das, dachte ich mir. Aber irgendwie hat er genau mit application.proccessmessages Probleme. Die Ereignisse werden nie ausgeführt, sobald ich die Anwendung unter Wine starte.
Ich habe auch schon versucht, den Server in einen Thread zu schieben. Allerdings folgte das gleiche Resultat.

Plz helft mir :(!

Tumm 12. Apr 2008 17:57

Re: Ereignisse in der Konsole
 
weiß denn niemand irgendeine andere Lösung als delay() :(?

Luckie 12. Apr 2008 18:01

Re: Ereignisse in der Konsole
 
Dein erstes Posting ist er 6 Stunden her, zu dem ist es Wochenende. Findest du nicht auch, dass du dich etwas gedulden solltest? Und warum nimmst du keinen Kompiler für Linux, wenn es auf Linux laufen soll?

Tumm 12. Apr 2008 18:13

Re: Ereignisse in der Konsole
 
a) Danke der freundlichen Antwort durch kompetente Mods, die ständig auftretende Fehler sehr liebenswürdig besehen.
b) Der Free Pascal Compiler "versteht" leider auch im Delphi-Modus nicht Direct Mysql, welches ich für die Datenbankverbindung gerne benutzen möchte. Mit dem GPC glaub ich wird das eh nich so viel, Open Kylix habe ich bisher nirgendwo zum Download gefunden.
c) Jaja sry ich war ein bisschen voreilig (mit dem anderen Post).

Der.Kaktus 12. Apr 2008 18:23

Re: Ereignisse in der Konsole
 
@Micha Sei nicht so hart ;-) kennst Du das nicht, es juckt in den Programmierfingern und durch ein Problem wird es gebremst? :-D

Tumm 13. Mai 2008 11:07

Re: Ereignisse in der Konsole
 
*push*

Und jetzt plz nich sagen dass 2mal pushen verboten ist

Muetze1 13. Mai 2008 11:45

Re: Ereignisse in der Konsole
 
Du hast ein grundsätzliches Designproblem, wenn du eine solche Endlosschleife in deinem Projekt hast. Die Socket Komponenten laufen definitiv ohne Probleme und deren Events werden auch unter Last noch ordentlich aufgerufen. Schon allein das vorhanden sein der von dir gezeigten Schleife macht deutlich, dass du die Anwendung falsch aufgebaut hast.

Du hast nun deine Endlosschleife sowie die Nachrichtenschleife der VCL im selben Thread laufen, somit ist es nicht verwunderlich, dass deine Socket Events nicht mehr ankommen, schliesslich synchronisieren die Socket-Threads zum VCL Thread, aber der kommt ja nicht mehr zum Zuge, da du in deiner Endlosschleife Kreise läufst.

Also zur grundlegenden Frage: Wozu und wo brauchst du diese o.g. Endlosschleife?

/EDIT: Ok, es geht um ein Konsolenprogramm, somit folgendes: Du brauchst eine Nachrichtenschleife als Endlosschleife. Damit sollte dann dein Socketproblem genauso gelöst sein.

Tumm 13. Mai 2008 12:21

Re: Ereignisse in der Konsole
 
ähh Ich hab die Schleife eigentlich letzendlich nur eingebaut, damit das Programm nicht beendet wird :(

Schwedenbitter 17. Dez 2009 21:47

Re: Ereignisse in der Konsole
 
Zitat:

Zitat von Tumm
... Das Problem ist bloß, dass ich dieses Programm auf einem Linux-Server zum Laufen bringen muss. WINE kann das, dachte ich mir. ...

Hast Du Dein Problem zwischenzeitlich lösen können?

Ich habe dasselbe Anliegen. Ich habe das mit diesem Code "gelöst", der unter Windows problemlos läuft:
Delphi-Quellcode:
Program Server;

{$APPTYPE CONSOLE}

Uses
   Windows, ScktComp;

Type
   TServer      = Class
                     Server: TServerSocket;
                     Constructor Create;
                     Destructor Destroy; Override;
                     Procedure OnServerAccept(Sender: TObject; Socket: TCustomWinSocket);
                     Procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
                     Procedure OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
                     Procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
                 End;

Constructor TServer.Create;
Begin
   Server:=TServerSocket.Create(nil);
   Server.Port:=11471;
   Server.OnAccept:=OnServerAccept;
   Server.OnClientConnect:=OnClientConnect;
   Server.OnClientDisconnect:=OnClientDisconnect;
   Server.OnClientRead:=OnClientRead;
   Server.Open;
End;

Destructor TServer.Destroy;
Begin
   Server.Free;
End;

Procedure TServer.OnServerAccept(Sender: TObject; Socket: TCustomWinSocket);
Begin
   WriteLn('OnServerAccept');
End;

Procedure TServer.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
Begin
   WriteLn('OnClientConnect');
End;

Procedure TServer.OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
Begin
   WriteLn('OnClientDisconnect');
End;

Procedure TServer.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
Begin
   WriteLn('OnClientRead');
End;

// D A S  H A U P T P R O G R A M M

Var
   Msg         : TMsg;
   MyServer      : TServer;
Begin
   WriteLn('Server gestartet ...');
   WriteLn('---------------------------------------------');
   WriteLn('Programm beenden mit Strg + C');
   WriteLn('Es folgen die Ausgaben der Ereignisse:');
   WriteLn('---------------------------------------------');
   MyServer:=TServer.Create;
   While GetMessage(Msg, 0, 0, 0) Do
   Begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
   End;
   MyServer.Destroy;
End.
Leider läuft das Programm unter Linux/wine nur, wenn ich es unter KDE (als mit laufendem X-Server) starte.
Starte ich es ohne laufendes KDE auf einfach auf der Konsole, läuft es nicht. Es kommt die Fehlermeldung:
Zitat:

Application tried to create a window, but no driver could be loaded. Make sure that your X server is running and that $DISPLAY is set correctly.
Auch für den Fall, dass mir niemand mit Linux/wine helfen kann:
  • Wo/Wie bitte lege ich ein Fenster an?
  • Wie kann ich es ggf. verhindern (, so dass es auch in der Konsole läuft)?

Gruß, Alex

Astat 18. Dez 2009 01:53

Re: Ereignisse in der Konsole
 
Hallo Schwedenbitter.

Zitat:

Zitat von Schwedenbitter
  • Wo/Wie bitte lege ich ein Fenster an?
  • Wie kann ich es ggf. verhindern (, so dass es auch in der Konsole läuft)?

Gruß, Alex

In der "ScktComp.pas" wird mit folgender Function ein Windows Fenster erzeugt.

Delphi-Quellcode:
function TCustomWinSocket.GetHandle: HWnd;
begin
  if FHandle = 0 then

    FHandle := AllocateHwnd(WndProc);
  Result := FHandle;
end;
Um zu verhindern, dass ein Fenster erzeugt wird, muss die Komponente auf Blockierend umgestellt werden.
Leider sind die Windows Sockets nicht (natürlich MS) "berkeley socket" kompatibel.
Das in Windows vorhandene Asynchrone Messaging mit "Fenstern" gibt es unter UNIX nicht.
Hier musst Du dir ein entsprechendes Messaging selber nachbauen (Event Signalling),
unter Verwendung der "berkeley socket" 1.1 API

lg. Astat


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 Uhr.
Seite 1 von 2  1 2      

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