AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ereignisse in der Konsole

Offene Frage von "Tumm"
Ein Thema von Tumm · begonnen am 12. Apr 2008 · letzter Beitrag vom 19. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Tumm

Registriert seit: 17. Jun 2006
Ort: Celle
171 Beiträge
 
Turbo Delphi für Win32
 
#1

Ereignisse in der Konsole

  Alt 12. Apr 2008, 13:05
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 while true do sleep(1); durch 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 !
Code Gear = Kot Gier
  Mit Zitat antworten Zitat
Tumm

Registriert seit: 17. Jun 2006
Ort: Celle
171 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Ereignisse in der Konsole

  Alt 12. Apr 2008, 18:57
weiß denn niemand irgendeine andere Lösung als delay() ?
Code Gear = Kot Gier
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Ereignisse in der Konsole

  Alt 12. Apr 2008, 19:01
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Tumm

Registriert seit: 17. Jun 2006
Ort: Celle
171 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Ereignisse in der Konsole

  Alt 12. Apr 2008, 19:13
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).
Code Gear = Kot Gier
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Ereignisse in der Konsole

  Alt 12. Apr 2008, 19:23
@Micha Sei nicht so hart kennst Du das nicht, es juckt in den Programmierfingern und durch ein Problem wird es gebremst?
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
Tumm

Registriert seit: 17. Jun 2006
Ort: Celle
171 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Ereignisse in der Konsole

  Alt 13. Mai 2008, 12:07
*push*

Und jetzt plz nich sagen dass 2mal pushen verboten ist
Code Gear = Kot Gier
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Ereignisse in der Konsole

  Alt 13. Mai 2008, 12:45
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.
  Mit Zitat antworten Zitat
Tumm

Registriert seit: 17. Jun 2006
Ort: Celle
171 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Ereignisse in der Konsole

  Alt 13. Mai 2008, 13:21
ähh Ich hab die Schleife eigentlich letzendlich nur eingebaut, damit das Programm nicht beendet wird
Code Gear = Kot Gier
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Ereignisse in der Konsole

  Alt 17. Dez 2009, 22:47
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
Alex Winzer
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#10

Re: Ereignisse in der Konsole

  Alt 18. Dez 2009, 02:53
Hallo Schwedenbitter.

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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 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