AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Prism Nach CreateProcess keine Befehle mehr annehmen
Thema durchsuchen
Ansicht
Themen-Optionen

Nach CreateProcess keine Befehle mehr annehmen

Ein Thema von Stacker · begonnen am 20. Nov 2006 · letzter Beitrag vom 21. Nov 2006
Antwort Antwort
Stacker

Registriert seit: 12. Okt 2006
5 Beiträge
 
#1

Nach CreateProcess keine Befehle mehr annehmen

  Alt 20. Nov 2006, 00:09
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
Angehängte Dateien
Dateityp: pas redirectconsole_340.pas (4,1 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Nach CreateProcess keine Befehle mehr annehmen

  Alt 20. Nov 2006, 12:54
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
  Mit Zitat antworten Zitat
Stacker

Registriert seit: 12. Okt 2006
5 Beiträge
 
#3

Re: Nach CreateProcess keine Befehle mehr annehmen

  Alt 20. Nov 2006, 16:42
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.?
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Nach CreateProcess keine Befehle mehr annehmen

  Alt 21. Nov 2006, 09:59
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
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
Stacker

Registriert seit: 12. Okt 2006
5 Beiträge
 
#5

Re: Nach CreateProcess keine Befehle mehr annehmen

  Alt 21. Nov 2006, 10:12
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
  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 12:18 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