Чтобы решить проблему консольного приложения, зависшего из-за ожидания ввода с GUI, вы можете использовать потоки вместо блокирующих вызовов. В вашем случае, вы можете использовать поток для чтения ввода с GUI и передавать данные в главный поток, где они могут быть обработаны.
Вот пример кода, который демонстрирует это:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdTelnet, IdGlobal;
type
TForm1 = class(TForm)
IdTelnet1: TIdTelnet;
procedure IdTelnet1Connected(Sender: TObject);
procedure IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: TIdBytes);
procedure IdTelnet1Disconnected(Sender: TObject);
private
{ Private declarations }
procedure ReadInput;
FInputThread: TThread;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.IdTelnet1Connected(Sender: TObject);
begin
// TODO: Add code here
end;
procedure TForm1.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: TIdBytes);
begin
// TODO: Add code here
end;
procedure TForm1.IdTelnet1Disconnected(Sender: TObject);
begin
// TODO: Add code here
end;
procedure TForm1.ReadInput;
var
Input: string;
begin
repeat
Input := Readln;
if Input = 'quit' then
Break;
// TODO: Process input and send it to IdTelnet1
until False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FInputThread := TThread.Create(ThreadProcedure(ReadInput));
FInputThread.Start;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FInputThread.Terminate;
FInputThread.WaitFor;
end;
end.
В этом примере, поток ReadInput запускается в FormCreate и читает ввод пользователя с помощью Readln. Когда пользователь вводит 'quit', поток завершается. В главном потоке, IdTelnet1 может обрабатывать данные, полученные от потока ReadInput.
В примере представлено решение проблемы зависания консольного приложения из-за ожидания ввода с GUI, где используется поток для чтения ввода и передачи данных в главный поток для обработки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.