启动终端程序,但在终端关闭后继续运行 - Lazarus或Delphi

时间:2015-02-02 16:52:37

标签: delphi background terminal lazarus freepascal

Pre-amble:我在Windows 7上使用Lazarus 1.2.6和Freepascal 2.6.4,我的解决方案必须基于 - 而不是C或C ++。我可以使用Delphi,如果存在类似的东西。

问题:我希望创建一个理想情况下从命令行启动的小程序,但之后只需在后台运行,而无需打开控制台应用程序。

我试图弄清楚如何最好地实现它。

我看了this linkthis link以及this C based examplethis Linux example,但是当一个用户指出"如果您不想要控制台应用程序,不要制造一个",这引出了其他方式的问题?如果你不想要一个GUI,并且你不想要一个控制台,我假设有另一种方法来创建一个静默程序,然后启动它,然后让它在后台运行?预先作为一项服务或一些这样的服务?

或者,对我来说另一种方式是创建一个库(当然在编译时生成一个DLL),它包含我的程序函数,在DLL的末尾导出这些函数,然后从一个单独的终端调用它们应用程序,我认为,然后我可以关闭,但从DLL调用的函数可能会继续运行?换句话说 - 两个程序 - 一个终端程序启动另一个不可见的程序,然后关闭启动程序?这是可能的还是推荐的?

4 个答案:

答案 0 :(得分:3)

I've written about this topic before,但不是特别针对Delphi或Free Pascal。

使用{$APPTYPE GUI}指令告诉编译器生成 GUI应用程序而不是控制台应用程序。您通常将它放在主项目文件的顶部附近,program语句所在的位置。使用该指令时,程序既不会继承其父控制台,也不会创建新控制台。如果你真的不想要一个GUI,那就不要显示任何窗口;如果您有控制台应用程序,操作系统会自动为您创建控制台,因为"consoleness" is a property of the EXE file

使用单独的程序和DLL不会产生您正在寻找的效果。如您所知,函数会阻止调用者返回。因此,当主程序调用您的DLL函数时,它会等到它退出后再退出。 DLL不是一个单独的程序;它不能在没有主机的情况下运行。 (使用单独的线程也不会起作用,因为当主线程终止程序时,它会销毁所有其他线程,无论它们是否已完成。)

答案 1 :(得分:1)

  

如果您不想要控制台应用程序,请不要制作。

这听起来像我可能会说的!!是的,这就是解决这个问题的方法。当一个控制台应用程序启动另一个控制台应用程序时,父进程将阻塞,您可以安排子进程脱离其父级控制台,但是您最终会得到两个控制台。

您真正想要做的是创建一个面向GUI子系统而非控制台子系统的进程。换句话说,你不想要一个控制台应用程序,所以不要制作一个。改为制作GUI应用程序。

现在,GUI应用程序并不意味着您必须显示GUI。这样做没有任何悔意。您有一个进程可以脱离,在后台执行,而不是连接到父控制台。这是一个针对GUI子系统但不显示任何GUI的应用程序。

例如,此程序以GUI子系统为目标,但不显示GUI。它无用,因为它会无限期地阻塞。但是,您可以将其替换为后台任务。

program project1;
{$apptype gui}
uses
  windows;
begin
  Sleep(INFINITE);
end.

答案 2 :(得分:1)

Lazarus非常简单。只需编写小型启动程序:

program project1;

uses
    Process;

var
    p: TProcess;
begin
    p := TProcess.Create(nil);
    try
        p.ShowWindow := swoHIDE; // To hide your console app
        //p.ShowWindow := swoShowNormal; // To show your console app
        p.Options := [poNewConsole];
        p.CommandLine := 'cmd'; // Change to your app name
        p.Execute;
        Writeln('Programm launched.');
    finally
        p.Free;
    end;
end.  

实际上,它不是拉撒路而是纯粹的FPC计划。

答案 3 :(得分:0)

假设您只在Windows下使用此程序,只需拨打FreeConsole from the Windows API

  

FreeConsole功能

     

从其控制台中分离调用进程。

例如这个简单的程序:

program project1;
uses
  sysutils, windows;
begin
  FreeConsole;
  while(true) do
    sleep(50);
end.

可以从资源管理器或cmd启动并无限运行,而无需显示自己的控制台。从其他控制台启动时,即使另一个cmd实例已关闭,它也会继续运行。