AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi In Konsolenanw. auf Firebird-Events reagieren?
Thema durchsuchen
Ansicht
Themen-Optionen

In Konsolenanw. auf Firebird-Events reagieren?

Ein Thema von RSE · begonnen am 5. Dez 2012 · letzter Beitrag vom 7. Dez 2012
Antwort Antwort
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#1

AW: In Konsolenanw. auf Firebird-Events reagieren?

  Alt 5. Dez 2012, 12:28
Also mit folgendem Konstrukt empfange ich schon mal den Event:
Delphi-Quellcode:
  repeat
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      DispatchMessage(Msg);
    end
    else
      Sleep(0); // Rest der Zeitscheibe verwerfen
  until False;
Jetzt muss nur noch ein Abbruchkriterium her, damit ich nicht nur die Möglichkeit habe die Konsole zu schließen... Dazu werde ich mir jetzt http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx ansehen.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#2

AW: In Konsolenanw. auf Firebird-Events reagieren?

  Alt 5. Dez 2012, 13:02
Wenn ich die Schleife folgendermaßen erweitere, dann kann ich das Programm zwar sauber beenden, aber dann bekomme ich die Events nicht mehr:
Delphi-Quellcode:
  repeat
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
      DispatchMessage(Msg)
    else
      if ReadConsole(GetStdHandle(STD_INPUT_HANDLE), @Key, 1, NumRead, nil) and
         (NumRead > 0) then
        Exit
      else
        Sleep(0); // Rest der Zeitscheibe verwerfen
  until False;
Kommentiere ich die Erweiterung wieder aus, dann bekomme ich die Events wieder. Was hat das eine mit dem anderen zu tun?
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#3

AW: In Konsolenanw. auf Firebird-Events reagieren?

  Alt 5. Dez 2012, 14:49
ReadConsole hat tatsächlich gewartet, bis eine Eingabe erfolgt, bevor es zurückkehrt. Damit hat es natürlich den restlichen Programmablauf blockiert...
Die funktionierende Lösung ist die folgende:
Delphi-Quellcode:
procedure ProcessMessages;
var
  SIN: Cardinal;
  Num: Cardinal;
  IR: TInputRecord;
begin
  SIN := GetStdHandle(STD_INPUT_HANDLE);
  repeat
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
      DispatchMessage(Msg)
    else
    begin
      while PeekConsoleInput(SIN, IR, 1, Num) and (Num > 0) do
        if (IR.EventType = KEY_EVENT) and (IR.Event.KeyEvent.bKeyDown) then
          Exit
        else
          FlushConsoleInputBuffer(SIN); // sonst wird immer wieder der gleiche Puffer getestet und nie geleert;
      Sleep(0); // Rest der Zeitscheibe verwerfen
    end;
  until False;
end;
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: In Konsolenanw. auf Firebird-Events reagieren?

  Alt 5. Dez 2012, 15:46
Manchmal hilft es einem schon, wenn man seine Ideen nur schriftlich dokumentiert

Danke, dass du dies hier getan hast! Sicherlich interessant für einige, und verallgemeinert könnte man daraus ggf. sogar einen schönen Code-Lib Eintrag machen: "Windows Messages in Konsolenanwendungen verarbeiten" o.ä.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#5

AW: In Konsolenanw. auf Firebird-Events reagieren?

  Alt 5. Dez 2012, 16:46
Manchmal hilft es einem schon, wenn man seine Ideen nur schriftlich dokumentiert
Sehr richtig. Ich hatte schon Angst, dass jemand etwa sagen würde, weil ich mir ständig selbst geantwortet habe... Ich danke dir deshalb sehr für deinen Post!
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#6

AW: In Konsolenanw. auf Firebird-Events reagieren?

  Alt 5. Dez 2012, 16:55
Ich mach das in einer Konsolenanwendung mit IBObjects einfach durch Attachen eines eigenes Event-Handlers für das entsprechende OnEventAlert Event der EventAlerter Komponente. Kann nicht sagen, ob das auch mit IBDAC funktionieren würde.
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#7

AW: In Konsolenanw. auf Firebird-Events reagieren?

  Alt 5. Dez 2012, 17:43
@tsteinmaurer: Wenn du meinen ersten Beitrag aufmerksam gelesen hättest, wüsstest du, dass ich genau das gleiche mit den IBDACs mache. Nur kommt der Event eben durch eine Windows-Message in dein Programm, und wenn die nie bei der Komponente ankommt, kann die den Event nicht auslösen. Und da eine Konsolenanwendung nicht von Haus aus eine Message-Schleife hat, musste ich die selbst bauen. Das wird bei dir mit den IBOs nicht anders laufen.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:03 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