Delphi 如何创建不终止的控制台应用程序? C++中,控制台应用程序可以在Win主程序中有消息处理程序。 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; #ifdef _DEBUG CreateConsole("Title"); #endif hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); while(msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(IsDialogMessage(hwnd, &msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } } return 0; }

Delphi 如何创建不终止的控制台应用程序? C++中,控制台应用程序可以在Win主程序中有消息处理程序。 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; #ifdef _DEBUG CreateConsole("Title"); #endif hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); while(msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(IsDialogMessage(hwnd, &msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } } return 0; },delphi,multithreading,console,delphi-2009,console-application,Delphi,Multithreading,Console,Delphi 2009,Console Application,这使得进程在控制台窗口收到WM_QUIT消息之前不会关闭。我不知道如何在delphi中做类似的事情 我需要的不是一个消息处理程序,而是一个轻量级的“技巧”,使控制台应用程序像使用线程的GUI应用程序一样工作。因此,例如,可以在控制台应用程序不终止进程的情况下处理两个Indy TCP服务器 我的问题:这是如何实现的?我不确定我是否理解您需要做什么,但可能是这样的 program Project1; {$APPTYPE CONSOLE} uses Forms, Unit1 in 'Uni

这使得进程在控制台窗口收到WM_QUIT消息之前不会关闭。我不知道如何在delphi中做类似的事情

我需要的不是一个消息处理程序,而是一个轻量级的“技巧”,使控制台应用程序像使用线程的GUI应用程序一样工作。因此,例如,可以在控制台应用程序不终止进程的情况下处理两个Indy TCP服务器


我的问题:这是如何实现的?

我不确定我是否理解您需要做什么,但可能是这样的

program Project1;

{$APPTYPE CONSOLE}

uses
  Forms,
  Unit1 in 'Unit1.pas' {DataModule1: TDataModule};

begin
  Application.Initialize;
  Application.CreateForm(TDataModule1, DataModule1);
  while not Application.Terminated do
    Application.ProcessMessages;
end.
你开始了吗?它是一个控制台应用程序,当控制台关闭时将终止。您可以在数据模块中使用Indy组件

编辑:

没有
表单
单元的替代方案是:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  Msg: TMsg;
begin
  while integer(GetMessage(Msg, 0, 0, 0)) <> 0 do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.
程序项目1;
{$APPTYPE控制台}
使用
窗户;
变量
Msg:TMsg;
开始
整数(GetMessage(Msg,0,0,0))0开始时
翻译信息;
发送消息(Msg);
结束;
结束。

然而,我认为这对大多数Delphi组件都不起作用——我不知道Indy,但是如果它的一个单元引入了
表单
单元,那么我更喜欢第一个版本。

对于一个永不终止的程序来说,所需要的只是一个无限(或无限)循环。你的C++程序包含一个不定循环:<代码>(MSG消息!= WMYEXIT)块。Delphi的TApplication包含一个非常类似的不确定循环。如果您使用的是控制台应用程序而不是TApplication,那么您所要做的就是编写自己的无限循环,并将其放入调用堆栈底部的过程中

确定终止条件并创建一个while循环,该循环显示
while not condition do
。或者,如果你真的不希望它终止,那么说
,而说true做
。然后将TCP服务器逻辑放入循环体中

编辑:不将CPU固定在100的实现:

while true do
begin
  DoSomethingWithTCP;
  Sleep(0); 
end;

Sleep(0)调用会在剩余的时间段内将CPU转移回Windows,从而避免将CPU固定在100。每个时间片大约16毫秒长,如果您在主线程中所做的只是接收消息并将它们传递给其他线程,那么这应该足够了,除非您的负载非常重。

您可以使用SyncObjs单元及其类(如TEvent)使其保持等待并一直打开,直到事件对象出现从Indy线程获取信号。

编程控制台程序;
使用
System.SysUtils,
Winapi.Windows;
变量
Msg:TMsg;
布雷特:朗布尔;
开始
尝试
{这里是您的程序逻辑}
{启动自己的线程、tcp服务器等}
//这是Win32本机控制台消息循环:
重复
bRet:=Winapi.Windows.GetMessage(Msg,0,0,0);
如果Int32(bRet)=-1,则
开始
//错误
打破
结束
其他的
开始
翻译信息;
发送消息(Msg);
结束;
直到不是布雷特;
除了
关于E:Exception-do
开始
//例外地做某事
Writeln(E.Classname,“:”,E.Message);
结束;
结束;
结束。

这不是一个控制台应用程序,它是一个没有可见顶层窗口的标准GUI应用程序。否则,您就不需要调用
CreateConsole()
,控制台应用程序总是附带一个控制台。或者您希望在应用程序运行时保留空的控制台窗口吗?我希望在应用程序运行时保留空的控制台窗口,但我不希望它终止。我必须将一个gui应用程序替换为两个TCP服务器,并使用一个与gui运行方式相同的控制台(不终止)使用两个tcp服务器。如果您真的在编写一个tcp服务器,那么它可能应该是一个服务,在这种情况下,控制台和gui是不相关的,因为它的UI将永远不会以任何方式显示。+1这非常有效!我只会等待更好的答案,因为我不想包含“表单”,因为这会使exe太大。但如果其他人没有这样的解决方案,我承诺接受你的答案。谢谢!我不确定我是否理解所有的事情都是正确的。我试过这样做:“While(true)do;”,但CPU达到100%。你能详细解释一下,或者给我看看它是什么样子吗?我会很感激的+1从现在开始回答。:)很抱歉浪费了时间,Mason。我仍然有90%的CPU使用您更新的代码。但我感谢您尝试帮助我。希望我能+不止一次。
Sleep(0)
没有任何帮助-如果没有其他具有至少相同优先级的可运行线程,它将立即返回,并只会消耗更多周期。CPU负载在任何情况下都将达到100%,如果没有其他线程可以运行,则仅通过上下文开关。您至少需要
Sleep(1)
来挂起线程执行。