> 백엔드 개발 > C++ > Windows 양식 텍스트 상자에 실시간 명령 출력을 표시하는 방법은 무엇입니까?

Windows 양식 텍스트 상자에 실시간 명령 출력을 표시하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-27 12:11:09
원래의
916명이 탐색했습니다.

이 코드는 명령줄 프로세스를 실행하고 Windows Forms TextBox에 실시간 출력을 표시하는 방법을 보여줍니다. 명확성과 견고성을 위해 개선해 보겠습니다.

How to Display Real-time Command Output in a Windows Forms TextBox?

개선된 코드:

이 버전에는 오류 처리, 더 명확한 변수 이름, 향상된 스레딩 방식이 추가되었습니다.

<code class="language-csharp">using System;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Windows.Forms;

public static class CommandExecutor
{
    public delegate void OutputHandler(string line);

    public static int Run(string workingDirectory, string command, string arguments, 
                          OutputHandler outputHandler, bool hideWindow = true)
    {
        int exitCode = -1; // Initialize to an invalid value

        try
        {
            using (var process = new Process())
            {
                process.StartInfo.FileName = "cmd.exe";
                process.StartInfo.WorkingDirectory = workingDirectory;
                process.StartInfo.Arguments = $"/c \"{command} {arguments}\" 2>&1"; // Redirect stderr to stdout
                process.StartInfo.CreateNoWindow = hideWindow;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;

                if (outputHandler != null)
                {
                    process.OutputDataReceived += (sender, e) =>
                    {
                        if (e.Data != null)
                        {
                            outputHandler(e.Data);
                        }
                    };
                    process.ErrorDataReceived += (sender, e) =>
                    {
                        if (e.Data != null)
                        {
                            outputHandler($"Error: {e.Data}"); //Clearly mark error messages
                        }
                    };
                }

                process.Start();

                if (outputHandler != null)
                {
                    process.BeginOutputReadLine();
                    process.BeginErrorReadLine(); //Begin reading error stream
                    process.WaitForExit();
                }
                else
                {
                    process.WaitForExit();
                }

                exitCode = process.ExitCode;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        return exitCode;
    }

    public static string GetOutput(string workingDirectory, string command, string arguments)
    {
        StringBuilder output = new StringBuilder();
        Run(workingDirectory, command, arguments, line => output.AppendLine(line));
        return output.ToString();
    }
}


public partial class Form1 : Form
{
    private TextBox txtOutput; //Declare TextBox

    public Form1()
    {
        InitializeComponent();
        txtOutput = new TextBox { Dock = DockStyle.Fill, Multiline = true, ScrollBars = ScrollBars.Both };
        Controls.Add(txtOutput); // Add the TextBox to the form

        //Add a button (btnExecute) to your form in the designer.
    }

    private void btnExecute_Click(object sender, EventArgs e)
    {
        //Get command and arguments from your textboxes (e.g., textBoxCommand, textBoxArguments)
        string command = textBoxCommand.Text;
        string arguments = textBoxArguments.Text;

        CommandExecutor.Run(@"C:\", command, arguments, line =>
        {
            if (txtOutput.InvokeRequired)
            {
                txtOutput.Invoke(new MethodInvoker(() => txtOutput.AppendText(line + Environment.NewLine)));
            }
            else
            {
                txtOutput.AppendText(line + Environment.NewLine);
            }
        });
    }
}</code>
로그인 후 복사

주요 개선 사항:

  • 오류 처리: try-catch 블록은 프로세스 실행 중 잠재적인 예외를 처리합니다.
  • 명확한 이름 지정: 설명적인 변수 이름이 많아지면 가독성이 향상됩니다(CommandExecutor, workingDirectory).
  • 오류 스트림 처리: 이제 코드가 명령의 오류 출력을 읽고 표시합니다.
  • 스레드 안전성: InvokeRequired 검사는 백그라운드 스레드에서 TextBox를 업데이트할 때 스레드 안전성을 보장합니다.
  • Environment.NewLine: 플랫폼 전체에서 일관된 줄 바꿈을 위해 Environment.NewLine를 사용합니다.
  • 단순화된 인수 처리: 더 깔끔한 인수 구성을 위해 문자열 보간을 사용합니다.
  • TextBox 별도 선언: 더 나은 구성을 위해 TextBox를 별도로 선언합니다.

Visual Studio 디자이너의 양식에 TextBox(예: txtOutput)와 버튼(예: btnExecute)을 추가해야 합니다. 명령과 인수를 입력하려면 텍스트 상자도 필요합니다. textBoxCommandtextBoxArguments을 텍스트 상자의 실제 이름으로 바꾸세요. 이 향상된 코드는 Windows Forms 애플리케이션에서 실시간 명령 출력을 표시하기 위한 더욱 강력하고 사용자 친화적인 솔루션을 제공합니다.

위 내용은 Windows 양식 텍스트 상자에 실시간 명령 출력을 표시하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿