다음 코드로 새 스레드에서 새 창을 열 수 있습니다.새 스레드에서 열리는 새 창에서 텍스트 상자를 업데이트하는 방법은 무엇입니까?
다음 코드는 MainWindow.xaml.cs를
private void buttonStartStop_Click(object sender, RoutedEventArgs e)
{
Test test = new Test();
Thread newWindowThread = new Thread(new ThreadStart(test.start));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
에서하고 test.start()
public void start()
{
OutputWindow outputwindow = new OutputWindow();
outputwindow.Show();
Output.print("Begin");
System.Windows.Threading.Dispatcher.Run();
Output.print("FINAL");
System.Windows.Threading.Dispatcher.Run();
}
에서 다음 그리고 다음은 출력 클래스에서입니다
public static void print(String str)
{
Dispatcher uiDispatcher = OutputWindow.myOutputWindow.Dispatcher;
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.AppendText(str + "\n"); }));
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.ScrollToLine(OutputWindow.myOutputWindow.textBoxOutput.LineCount - 1); }));
}
public static void printOnSameLine(String str)
{
Dispatcher uiDispatcher = OutputWindow.myOutputWindow.Dispatcher;
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.AppendText(str); }));
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.ScrollToLine(OutputWindow.myOutputWindow.textBoxOutput.LineCount - 1); }));
}
"Begin"텍스트 상자에 인쇄되지만 "FINAL"은 표시되지 않습니다. Test 클래스의 start 메소드를 upda로 설정합니다. 프로그램을 통해 outputwindow의 텍스트 상자를 봅니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
미리 감사드립니다.
답장과 코드를 보내 주셔서 감사합니다. 이것은 내가하려고하는 것입니다 : 1. buttonStartStop을 클릭하면 다른 클래스의 메서드가 시작되어 다른 스레드에서 실행되기를 원합니다. 2. "시작"방법은 텍스트 상자가 포함 된 새 창을 열며 작동하면서 사용자 의견을 제공하기 위해 텍스트 상자를 업데이트합니다. – Arya
먼저 텍스트 상자 양식을 작성한 다음 새 양식이 스레드를 작성하여 시작할 수 있습니다. 최소한 sleep() 루프 하나를 제거합니다. –
이 경우에는 현재 GUI 스레드에서 창을 열고 백그라운드 스레드에서 다른 모든 작업을 수행합니다. 열린 창에서의 업데이트는 GUI 디스패처를 통해 직접 이동할 수 있습니다. 어떻게 구성 할 것인가는 중요하지 않습니다. 다음을 고려하십시오. 1. 백그라운드 스레드에서 창을 작성한 경우 스레드를 STA로 설정하고 Show() 다음에 Dispatcher.Run()을 호출해야합니다. 2.열린 창에 대한 모든 호출은 Dispatcher 객체를 통과해야합니다. 3. "진행 정보"창이 처리를 실행하는 동일한 스레드에 있지 않아야합니다. 그렇지 않으면 처리가 차단됩니다. 몇 가지 코드가 필요하면 ... 저에게 의견을 말하십시오. – user1018735