Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prism Nach CreateProcess keine Befehle mehr annehmen (https://www.delphipraxis.net/81052-nach-createprocess-keine-befehle-mehr-annehmen.html)

Stacker 19. Nov 2006 23:09


Nach CreateProcess keine Befehle mehr annehmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

folgendes Problem ich habe eine IRC Bot geschrieben der über ein bestimmten Befehl eine Consolenanwendung startet. Um die Consolenanwendung zu starten nutze ich RedirectConsole.pas (gefunden hier im Form) damit ich den Text der Console in einem Memo habe.

Wenn ich nun per IRC die Console starte reagiet das Programm auf keine Befehle mehr. Wenn ich das selbe über einen Button mache funktioniert alle wie es soll. Warum?

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
  memo2.Clear;
  RC_Run(Edit4.Text+' --config '+Edit5.Text);
end;
so läuft alles bestens

Delphi-Quellcode:
if (content='!run') and (auser.nick = okuser) then
begin
  button3.Click;
  idirc1.say(auser.nick,'Prog gestartet ...');
end;
der .say wird nicht mehr ausgeführt.

Gruß Stacker

Der_Unwissende 20. Nov 2006 11:54

Re: Nach CreateProcess keine Befehle mehr annehmen
 
Hi,
ich denke mal dass das RC_RUN einfach auf die Rückkehr aus der Konsole wartet. Dann wird das say ausgeführt, sobald du halt die Konsole wieder schließt. Wie das ganze unter .net aussieht kann ich dir nicht sagen, aber es sollte auch hier die Möglichkeit geben einen Prozess nebenläufig zu starten. Alternativ erzeugst du halt einen Thread, der sich dann um das Öffnen/Umleiten der Konsole kümmert.

Gruß Der Unwissende

Stacker 20. Nov 2006 15:42

Re: Nach CreateProcess keine Befehle mehr annehmen
 
Zitat:

Zitat von Der_Unwissende
Hi,
ich denke mal dass das RC_RUN einfach auf die Rückkehr aus der Konsole wartet. Dann wird das say ausgeführt, sobald du halt die Konsole wieder schließt. Wie das ganze unter .net aussieht kann ich dir nicht sagen, aber es sollte auch hier die Möglichkeit geben einen Prozess nebenläufig zu starten. Alternativ erzeugst du halt einen Thread, der sich dann um das Öffnen/Umleiten der Konsole kümmert.

Habe mich noch nicht mit Theads beschäftigt. Wie öffne ich die Konsole in nem Thead? Haste mal ein Bsp.?

Wormid 21. Nov 2006 08:59

Re: Nach CreateProcess keine Befehle mehr annehmen
 
Also, wenn ich das hier teste (die Variante mit dem Button), dann funktioniert das bei mir auch tadellos...

Und es ist in der Tat so, das RC_Run auf das Ende der Consolen-Anwendung wartet. Hat die denn ein Ende?
Oder wartet die Anwendung z.B. auf ein "Zum beenden bitte Taste drücken" oder ähnliches?

Und wie sieht RC_LineOut aus? Vielleicht schmeisst das ja etwas durcheinander...

Greetz

Wormid

Stacker 21. Nov 2006 09:12

Re: Nach CreateProcess keine Befehle mehr annehmen
 
Hallo ich habe das Problem über Threads gelöst. Die Console hat keine Ende , sie läuft zu lange bis sie beendet wird.

Hier mal der Code

Delphi-Quellcode:
type
  TMyThread = class(TThread)
    exe:Tedit;
    command:Tedit;
    procedure Execute; override;
    procedure VCLSync;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RC_LineOut:=mylineout;
end;

procedure TMyThread.Execute;
begin
  if not Terminated then
  begin
    // Zugriff auf VCL-Elemente synchronisieren
    Synchronize(VCLSync);

    // etwas warten
    Sleep(10);
  end;
end;

procedure TMyThread.VCLSync;
begin
  RC_Run(exe.Text+' --config '+command.Text);
end;

procedure MyLineOut(s: string); // Output procedure
begin
  form1.memo2.lines.add(s);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  memo2.Clear;
  // Thread erzeugen (suspended)
  Th := TMyThread.Create(True);
  // Thread gibt sich selbst frei
  Th.FreeOnTerminate := True;
  // Progressbar zuweisen
  Th.exe := Edit4;
  Th.command := Edit5;
  // Thread starten
  Th.Resume;
  // Message anzeigen, Thread läuft weiter
  //ShowMessage('Thread Gestartet');
end;

if (content='!run') and (auser.nick = okuser) then
begin
  button3.Click;
  idirc1.say(auser.nick,'Prog gestartet ...');
end;
if (content='!stop') and (auser.nick = okuser) then
begin
  if not th.Terminated then th.Terminate;
  if not KillTask('...exe') then idirc1.say(auser.nick,'Prog nicht beendet ...');
end;
Danke für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:56 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