![]() |
was machen mit den Hangups ? Konsolenprobleme die zweite ^ ^
Hi leute. Brauch mal wieder eure Hilfe. Hab jetzt meine Konsole soweit fertig. Hat allerdings den gewaltigen Schönheitsfehler: :pale:
wenn ich z.B. while true do; ausführen lasse, lässt sich die Standardkonsole von Delphi abbrechen, meine eigene hängt allerdings fröhlich mit (es werden ja keine Messages mehr behandelt). Messages in nem extra thread behandeln is auch nicht ( schon probiert ) ausserdem besteht die automatisch gelinkte konsole auch nur aus 1 thread. Wie krieg ich das nu gebackn ? danke shcon mal^ :hello: Edit: ja die frage is imma noch offen Edit'2: für alle die mal sehen wollen was ich mein
Delphi-Quellcode:
1 Thread
program Project2;
{$APPTYPE CONSOLE} begin while true do; end. und trotzdem Message-behandlung ? Ist das in etwa über Interrupts gelöst ? Wenn ja wie setz ich das in Delphi um ??? |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Hi hboy,
ich weiß nicht genau was du meinst, aber es sieht stark so aus, als würdest du eine Nachrichtenschleife meinen. :lol: Ich hab das so gelöst:
Delphi-Quellcode:
//Edit: pushen bitte erst nach 24Stunden :warn:
var Shutdown: boolean;
Eingabe: string; while not Shutdown do begin readln(Eingabe); if lowercase(Eingabe) = 'quit' then begin writeln('# Server wird in Sek beendet'); sleep(5000); //5Sek auf das schließen warten writeln('# Auf Wiedersehen'); Shutdown := true; end; end; MfG Christian |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
hi danke erst mal für deine Antwort.
Wenn du dir mal reinziehen willst was ich mit meiner Konsole so ausgeheckt habe kannste dir den ersten Thread dazu anguckn ^^ ![]() diese hatte mehrere Macken: wenn ich Readln ausgeführt habe hat die Konsole zwar schön funktioniert, allerdings lies sie sich nicht beenden. also den Prozess beim OnHide terminieren. tut. Ich habe jetzt - da die Konsole ja auf den Code der Anwendung keinen Einfluss hat und da auch eine Endlosschleife stehen kann - einen extra Thread erzeugt, der allerdings keine Messages behandeln kann. Also bringt das auch nix. Stutzig hat mich dabei gemacht dass die *normale* Konsole von Delphi mit einem einzigen Thread auskommt. Demnach hab ich vermutet, dass der Programmablauf regelmäßig unterbrochen wird, um angefallene Messages zu behandeln ( Konsole is ja beweg- minimier und schließbar ) Und bevor ich die ganze Konsole in einen extra thread stecke ( was ja nicht sein muss ) wär es sehr chic rauszufinden wie es eleganter geht. Also getreu dem Motto :wiejetzt: hf hboy |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Was ist denn ...
Zitat:
Ich verstehe in deiner Frage nur Bahnhof. Falls du die "DOS-Konsole" meinst, die ist komplett anders aufgebaut und die Nachrichtenverarbeitung findet teils im Kernelmode statt. Daher nur "1 Thread". |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
normal mein ich die Konsole die bei $Apptype Console automatisch gelinkt wird
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Die wird nicht "automatisch gelinkt". Der PE-Header enthält dann die Info, daß er das Console-Subsystem benutzen soll und alloziert automatisch die Konsole oder startet das Programm in der "Elternkonsole" wenn vorhanden. Da ist kein Stück von Delphi dabei beteiligt.
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
okok... und jetzt zu >>>>>> meinem problem <<<<<< um das es eigentlich geht ;)
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Moin hboy,
wenn Du ein Programm mit Messagebehandlung aber ohne Fenster haben willst, nimmst Du ein "normales" und setzt Application.ShowMainform auf false. |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
Also ohne Threads gehts evtl. mit Overlapped I/O, aber ansonsten wirst du bei Nutzung von Pipes (was ja nicht anders geht) kaum drumherumkommen. |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Problem ist:
Progamm hängt (logischerweise) bei einer Endlosschleife. jetzt will ich aber ( Interupts gibts ja wohl nich ? ) aus einem weiteren thread die eingehenden Messages behandeln. Ich frage mich jetzt ob ich den thread separat laufen lassen kann oder ob ich eigentliche Konsole mit in den Thread packen muss. PS: ICH WILL WIEDER IN MEINE HEILE µC-WELT ZURÜCK ;) |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
die frage is ja gerade wie ich es dann realisier. bis jetzt gibts den Message loop nur beim Lesen einer Eingabe. Naja ich werds wohl in nen separaten thread packen und etwas umschreiben dann müsst es gehn :)
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
Delphi-Quellcode:
das hier ist irgendwie quatsch :( kA wieso
procedure TConsoleWnd.ProcessMessage;
var msg: TMsg; begin if GetMessage(msg,0,0,0) then begin TranslateMessage(msg); DispatchMessage(msg); end; end; procedure MessageProc(param: Cardinal); begin while true do TConsoleWnd(param).ProcessMessage; end; procedure TConsoleWnd.SetUseMessageThread(doit: Boolean); begin if (self.fUseMessageThread = false) and doit then begin BeginThread(nil,0,@MessageProc,@self,0,TID); end; if (self.fUseMessageThread = true) and (not doit) then begin TerminateThread(TID,0); end; end; |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Mooooment, wo ist denn der I/O mit den Pipes?
Also die Nachrichtenschleife hast du ja in einem Extra-Thread - dort kannst du dann simultan auf Events und Messages warten. |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
... nur dass da keine Messages behandelt werden :( es lassen sich einfach keine abfragen. wieso ?
und der rest läuft über ... mom
Delphi-Quellcode:
Function DevOpen(var F: TTextRec): Integer;
begin result :=0; end; Function DevInOut(var F: TTextRec): Integer; begin case f.Mode of fmOutput: ConsoleOut(F); fmInput : ConsoleIn (F); fmInOut : ConsoleOut(F); end; result :=0; end; Function DevFlush(var F: TTextRec): Integer; begin DevInOut(F); FillChar(F.Buffer,F.BufPos-1,0); F.BufPos := 0; result :=0; end; Function DevClose(var F: TTextRec): Integer; begin result :=0; end; procedure AssignDev(var F: Text); begin with TTextRec(F) do begin Mode := fmClosed; BufSize := SizeOf(Buffer); BufPtr := @Buffer; OpenFunc := @DevOpen; InOutFunc := @DevInOut; FlushFunc := @DevFlush; CloseFunc := @DevClose; Name[0] := #0; end; end; initialization ConsoleWin := TConsoleWnd.Create(0); ConsoleWin.Caption := system.ParamStr(0)+ ' - NVConsole'; ConsoleWin.Show; consolewin.UseMessageThread := true; ConsoleWin.proto.AddLine('NonVCL Console v0.1 2005 ',$0,$00C000); ConsoleWin.proto.AddLine('',0,0); AssignDev(Output); AssignDev(Input); finalization killed:= true; end. tadaa... |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Deine Anwendung ist also bereits eine Fensteranwendung? In diesem Falle gibt es bereits eine Message-Loop und diese müßtest du benutzen. Ich ging davon aus, daß du mit Pipes arbeitest. Sieht aber nicht danach aus, wenn ich mir den obigen Code anschaue.
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
nur dass das Fenster NonVCL is...
PS: also wenn da einer wäre hätte ich den selber programmiert und wüsste es :) |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
es gibt keinen ! oder doch ?...
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
nice one... nein es gibt wirklich keinen. die ( diesmal mit richtigem genus für Schleife ^^ ) Message-loop wirst du vergeblich suchen. es gibt eine bei ConsoleIn, die allerdings nach Ende der eingabe abgebrochen wird.
Wenn das so weitergeht pack ich das ganze zeug doch in einen Thread, mach ne eigene Message-loop und versuche, das Fensterli bei der CloseFunc zu schließen... |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
ich wollte deswegen keine eigene message-verarbeitung, weil ich ja sonst die key events des Fensters verwenden müsste, so kann ich mir die Zeichen direkt aus der Message holen. Nur so als Anmerkung.
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Erstens:
Hierarchie
Delphi-Quellcode:
ist das meine eigene Fensterklasse, zweitens gibt es kein application und deswegen auch kein application.run in dem die sein könnte und drittens wird das Fenster direkt über die WindowProc initialisiert, oder sollte ich mich da irren ?. Dazu braucht es noch keine Schleife um eine Queue abzuarbeiten.
TObject
| TCustomWnd | TWnd | TConsoleWnd Sag mir wo die Message-loop stecken soll ? PS: zum Thema detaillierter Einblick in diesen Thread: Ich habe diese Konsole da ![]() bis jetzt so weit gebracht. Programm ist ~130kb groß. Das will ich mit der VCL mal sehn ;) |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
wenn ich mir deinen Code unter
![]() |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
Zitat:
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
hm also 1. Feststellung: es *braucht* einen loop. ja genau darum geht es ja wie ich die schleife unterbing ohne mein ganzes konzept übern haufen zu schmeißen ( nicht vorher eingeplant da nice-to-have )
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
hättest den Klassenname nennen müssn. ich nehm mal an TConsoleWnd. TCustomWnd is meine heilige kuh ;)
Delphi-Quellcode:
unit ConsoleWnd;
interface uses WndClass, StaticClass, types, windows, sysutils; type TConsoleWnd = class(TCustomWnd) proto: TCustomWndProtocolstatic; killed : boolean; Constructor Create(Param: Cardinal); Destructor Destroy; override; private fUseMessageThread: Boolean; TID: Cardinal; procedure Resize(Sender: TObject); procedure Hide(Sender: TObject); procedure SetUseMessageThread(doit: Boolean); public property UseMessageThread: Boolean read fUseMessageThread write SetUseMessageThread; procedure ProcessMessage; end; var WinKilled: Boolean; implementation Constructor TConsoleWnd.Create(Param: Cardinal); begin inherited; self.Width := 700; self.Height := 400; self.UseMinConstraints := true; self.MinConstraintsVal := Point(700, 400); proto := TCustomWndProtocolstatic.Create(self.handle); proto.Width := self.ClientRect.Right; proto.Height := self.ClientRect.Bottom; proto.font.Color := $FFFFFF; proto.font.Name := 'Courier'; proto.Color := $0; proto.Clear; self.OnResize := Resize; self.OnHide := Hide; end; procedure TConsoleWnd.Resize(Sender: TObject); begin if self.ClientRect.Bottom =0 then exit; proto.Width := self.ClientRect.Right; proto.Height := self.ClientRect.Bottom; end; procedure TConsoleWnd.Hide(Sender: TObject); begin proto.Hide; windows.TerminateProcess(GetCurrentProcess,0); end; Destructor TConsoleWnd.Destroy; begin proto.Free; inherited; end; procedure TConsoleWnd.ProcessMessage; var msg: TMsg; begin if GetMessage(msg,0,0,0) then begin TranslateMessage(msg); DispatchMessage(msg); end; end; procedure MessageProc(param: Cardinal); begin while true do TConsoleWnd(param).ProcessMessage; end; procedure TConsoleWnd.SetUseMessageThread(doit: Boolean); begin if (self.fUseMessageThread = false) and doit then begin BeginThread(nil,0,@MessageProc,@self,0,TID); end; if (self.fUseMessageThread = true) and (not doit) then begin TerminateThread(TID,0); end; end; end. |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
kleine zwischenbilanz:
Das hier artet irgendwie in eine code- und Textschlacht aus. der Lösung bin ich allerdings noch nicht viel näher gekommen. |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
*kopfauftastahau* maaan was sag ich denn die ganze zeit...
Delphi-Quellcode:
unit CCL;
/////////////////////////////////////////////////// // Custom Component Library // // // // Entwicklung eigener Klassen ohne die VCL // // // // Autor: hboy 2004 / 2005 // /////////////////////////////////////////////////// interface uses WndClass, MenuClass, PanelClass, NCDefWndClass, StaticClass; type TWnd = class(TCustomWnd); type TWndControl = class(TCustomWndControl); type TWndChild = class(TCustomWndChild); type TWndMenuItem = class(TCustomWndMenuItem); type TWndMenuFrame = class(TCustomWndMenuFrame); type TWndPanel = class(TCustomWndPanel); type TWndButton = class(TCustomWndButton); type TWndSwitch = class(TCustomWndSwitch); type TWndProtocolStatic = class(TCustomWndProtocolStatic); implementation end. |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
also Oli...
erst mal danke dass du dich immer noch damit rumquälst. Nich jeder hat so viel geduld :thumb: dass du mir unterstellt hast ich müsste mir erst mal grundlagenwissen aneignen is schon bissl herb aba kay... also wenn ich die Konsole in eine vcl-anwendung reinschmeiß ( welch ironie, nich ^^ ) dann tut das natürlich wegen der Message-Loop in Application. Das Problem bleibt immer noch das die Message behandlung in dem extra thread nicht funzt, und ich kein plan hab wie ich es anstellen soll. Vielleicht doch das Konsolenfenster in einem völlig separaten thread basteln und Messages behandeln ? Und was ist dann mit der Message-loop beim ConsoleIn ? |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Okay, rekapitulieren wir mal die Regeln für Fenster. Die Message-Loop muß im selben Thread sein, welcher das Fenster erstellt. Ist dies bei dir der Fall? IMO nein.
Im Platform SDK steht: An application must remove and process messages posted to the message queues of its threads. A single-threaded application usually uses a message loop in its WinMain function to remove and send messages to the appropriate window procedures for processing. Applications with multiple threads can include a message loop in each thread that creates a window. Zitat:
Daß mit den Grundlagen war sicherlich nicht böse gemeint, aber unter Windows gilt nunmal: kein Fenster ohne Nachrichtenschleife. |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
bis jetzt hatte ich ja eine "bei Bedarf" ;)
Also jetzt bin ich nur noch gespannt ob ich das mit den Treiberfunktionen gebacken krieg ^^ wenn die die funktionen in nem anderen thread aufrufen müssn |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
achja... platfrom sdk ? sowas gibts :spin2: uiuiui ;) *grins* sowas wäre auch mal nich schlecht *g*
PS: bin ja noch gottfroh dass du mich nich nach MSDN-Land geschickt hast ^^ |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
![]() das da ? hm muss gehn. morgen mathe Klausur. cya&thx |
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
Zitat:
|
Re: was machen mit den Hangups ? Konsolenprobleme die zweite
OK.
------------------------------------ Frage1: gibt es eine Möglichkeit Messages von fremden Threads zu holen und zu verarbeiten ? Es schaut so aus, dass im Hauptthread ein Fenster erzeugt wird, und wenn der Hauptthread hängt, sollen die Messages an das Fenster weiterhin abgearbeitet werden. Packe ich die Erzeugung des Fensters in einen separaten Thread, ergibt sich das Problem, dass wiederum von dem Thread mit Fenster auf globale Variablen (Input und Output) zugegriffen (AssignDev) wird, was allerdings zu Fehlern führt. Frage2: wie löse ich das Problem wenn es keine Möglichkeit zu Frage1 gibt ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 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