Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi was machen mit den Hangups ? Konsolenprobleme die zweite ^ ^ (https://www.delphipraxis.net/37700-machen-mit-den-hangups-konsolenprobleme-die-zweite-%5E-%5E.html)

Assarbad 11. Jan 2005 17:57

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Zitat:

Zitat von hboy
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.

Na ob du das zusammenpacken willst oder in verschiedenen Threads und dafür synchronisiert realisierst ist doch deine Sache. Ich würde es vermutlich in den selben Thread packen, in dem du ja, wie ich vermute, eine Wait-Funktion benutzt. Dort wäre dann entsprechend eine Funktion ala MsgWaitForMultipleObjects() angebracht.

hboy 11. Jan 2005 19:46

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 :)

hboy 11. Jan 2005 19:50

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Zitat:

Zitat von Assarbad
... ob du das zusammenpacken willst oder in verschiedenen Threads und dafür synchronisiert realisierst ist doch deine Sache.

ja und wie kann ich in einem separaten Thread messages holen und verarbeiten ?

Delphi-Quellcode:
 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;
das hier ist irgendwie quatsch :( kA wieso

Assarbad 11. Jan 2005 20:23

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.

hboy 11. Jan 2005 20:40

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...

Assarbad 11. Jan 2005 21:20

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.

hboy 11. Jan 2005 21:56

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 :)

Assarbad 11. Jan 2005 22:15

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Zitat:

Zitat von hboy
nur dass das Fenster NonVCL is...

PS: also wenn da einer wäre hätte ich den selber programmiert und wüsste es :)

Ist doch irrelevant ob es nonVCL ist. Wo steckt die Haupt-Messageloop?

hboy 11. Jan 2005 22:29

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
es gibt keinen ! oder doch ?...

Assarbad 12. Jan 2005 00:09

Re: was machen mit den Hangups ? Konsolenprobleme die zweite
 
Zitat:

Zitat von hboy
es gibt keinen ! oder doch ?...

Hoppala, da fehlen einem aber die Worte. Du solltest dir mal die Grundlagen der Win32-Programmierung (VCL und/oder nonVCL) anschauen. Natürlich gibt es eine Message-Loop. Da ich nicht weiß, wie du dein Fenster aufrufst, kann ich dir nicht sagen wo die Schleife steckt. Sie kann auch Implizit existieren, wenn du zB per DialogBoxParam() o.ä. ein Fenster erzeugst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 Uhr.
Seite 2 von 5     12 34     Letzte »    

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