![]() |
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:
durch
while true do sleep(1);
Delphi-Quellcode:
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.
while true do application.proccesmessages;
Ich habe auch schon versucht, den Server in einen Thread zu schieben. Allerdings folgte das gleiche Resultat. Plz helft mir :(! |
Re: Ereignisse in der Konsole
weiß denn niemand irgendeine andere Lösung als delay() :(?
|
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?
|
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). |
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
|
Re: Ereignisse in der Konsole
*push*
Und jetzt plz nich sagen dass 2mal pushen verboten ist |
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. |
Re: Ereignisse in der Konsole
ähh Ich hab die Schleife eigentlich letzendlich nur eingebaut, damit das Programm nicht beendet wird :(
|
Re: Ereignisse in der Konsole
Zitat:
Ich habe dasselbe Anliegen. Ich habe das mit diesem Code "gelöst", der unter Windows problemlos läuft:
Delphi-Quellcode:
Leider läuft das Programm unter Linux/wine nur, wenn ich es unter KDE (als mit laufendem X-Server) starte.
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. Starte ich es ohne laufendes KDE auf einfach auf der Konsole, läuft es nicht. Es kommt die Fehlermeldung: Zitat:
Gruß, Alex |
Re: Ereignisse in der Konsole
Hallo Schwedenbitter.
Zitat:
Delphi-Quellcode:
Um zu verhindern, dass ein Fenster erzeugt wird, muss die Komponente auf Blockierend umgestellt werden.
function TCustomWinSocket.GetHandle: HWnd;
begin if FHandle = 0 then FHandle := AllocateHwnd(WndProc); Result := FHandle; end; 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 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz