>백엔드 개발 >C++ >다른 클래스의 백그라운드 스레드에서 UI를 안전하게 업데이트하는 방법은 무엇입니까?

다른 클래스의 백그라운드 스레드에서 UI를 안전하게 업데이트하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-05 19:34:40437검색

How to Safely Update a UI from a Background Thread in Another Class?

다른 클래스의 백그라운드 작업에서 UI를 업데이트하는 방법

백그라운드 작업은 UI를 정지하지 않고도 긴 작업을 실행할 수 있습니다. 그러나 이러한 작업에서 UI를 업데이트하려면 크로스 스레드 메커니즘이 필요합니다. 이 문서에서는 이벤트와 대리자를 사용하여 이를 수행하는 방법을 설명합니다.

이벤트 및 대리자 사용

백그라운드 스레드에서 UI를 업데이트하려면 이벤트와 대리자를 사용할 수 있습니다. 특정 이벤트가 발생하면 이벤트가 발생하므로 구독자가 응답으로 미리 정의된 코드를 실행할 수 있습니다. 대리자는 별도의 스레드에서 호출할 수 있는 메서드를 나타냅니다.

이벤트 기반 접근 방식

이 접근 방식에서는 UI가 필요할 때 백그라운드 스레드가 이벤트를 발생시킵니다. 업데이트되었습니다. 메인 스레드는 이 이벤트를 구독하고 적절한 UI 업데이트 코드를 실행합니다. 예는 다음과 같습니다.

class MainWindow : Window
{
    private void startCalc()
    {
        // ...
        CalcClass calc = new CalcClass();
        calc.ProgressUpdate += (s, e) =>
        {
            Dispatcher.Invoke((Action)delegate() { /* Update UI */ });
        };
        Thread calcthread = new Thread(new ParameterizedThreadStart(calc.testMethod));
        calcthread.Start(input);
    }
}

class CalcClass
{
    public event EventHandler ProgressUpdate;

    public void testMethod(object input)
    {
        // ...
        if (ProgressUpdate != null)
            ProgressUpdate(this, new YourEventArgs(status));
        // ...
    }
}

작업 기반 접근 방식(C# 4.5 이상)

또 다른 옵션은 비동기 작업을 나타내는 작업을 사용하는 것입니다. 태스크는 Task.Run 메서드를 사용하여 생성할 수 있으며 별도의 스레드에서 코드를 실행하는 깔끔한 방법을 제공합니다.

class MainWindow : Window
{
    Task calcTask = null;

    void buttonStartCalc_Clicked(object sender, EventArgs e) { StartCalc(); }
    async void buttonDoCalc_Clicked(object sender, EventArgs e)
    {
        await CalcAsync();
    }

    void StartCalc()
    {
        var calc = PrepareCalc();
        calcTask = Task.Run(() => calc.TestMethod(input));
    }
    Task CalcAsync()
    {
        var calc = PrepareCalc();
        return Task.Run(() => calc.TestMethod(input));
    }
    // ...
}

class CalcClass
{
    public event EventHandler<EventArgs<YourStatus>> ProgressUpdate;

    public TestMethod(InputValues input)
    {
        // ...
        ProgressUpdate.Raise(this, status);
        // ...
    }
}

결론

두 이벤트- 기반 및 작업 기반 접근 방식을 사용하여 백그라운드 스레드에서 UI를 업데이트할 수 있습니다. 이벤트 기반 접근 방식은 더 간단하지만 작업 기반 접근 방식은 더 나은 제어 및 오류 처리 기능을 제공합니다. 특정 요구 사항에 가장 적합한 접근 방식을 선택하세요.

위 내용은 다른 클래스의 백그라운드 스레드에서 UI를 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.