Windows GUI 프로그래밍 시작 14 처리 중 표시
■소개
이전 프로그램은 큰 CSV를 로드하면 로드 완료까지 화면이 굳어져 버립니다.
그래서 이번에는 그 대책을 합니다.
키워드: TaskbarItemInfo, async, await, 문서 개요
[주의]
지금까지 설명한 조작 방법 등은 설명을 생략하거나 간략화하는 경우가 있습니다.
■ 개발 환경
■ 만들어 보자
◇처리중 텍스트
문서 개요에서 listView
눈 아이콘을 클릭하여 목록 보기를 숨깁니다.
TextBlock
를 목록 뷰가 있는 그리드 행(Row=1)에 배치합니다.
TextBlock
를 마우스 오른쪽 버튼으로 클릭하고 '레이아웃'- '모두 재설정'하고,x:Name
를 loadingText
로 하고,
속성의
레이아웃 - HorizontalAlignment
및 VerticalAlignment
를 Center
로,
「텍스트」의 FontSize
를 48 px
에,
공통의 Text
를 読み込み中・・・
로 설정합니다.
TextBlock
의 속성 「외관」의 Visibility
를 Collapsed
로 해서 숨깁니다.
TextBlock
설정이 끝났으므로 문서 개요에서 listView
를 숨기십시오.
지금까지 TextBlock
의 정의는 다음과 같습니다.
<TextBlock x:Name="loadingText" Grid.Row="1" TextWrapping="Wrap" Text="読み込み中・・・" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Visibility="Collapsed"/>
◇처리중 태스크 바
MainWindow
에 작업 표시줄 처리 중 표시에 대한 정의를 추가합니다.
<Window.TaskbarItemInfo>
<TaskbarItemInfo x:Name="taskbarInfo"/>
</Window.TaskbarItemInfo>
◇로직
생성자에 다음 처리를 추가합니다.
// 複数のスレッドからのアクセスを有効化
BindingOperations.EnableCollectionSynchronization(this.ZipRecords, new object());
다음 메소드를 추가합니다.
/// <summary>
/// データ読み込み中の画面表示
/// </summary>
/// <param name="loading">データ読み込み中の時にtrue, 読み込み終わったらfalseを設定する</param>
private void SetLoadingUI(bool loading)
{
if (loading)
{
// 処理中
// 画面全体を無効化
this.IsEnabled = !loading;
// 処理中メッセージを表示
loadingText.Visibility = Visibility.Visible;
// リストを隠す
listView.Visibility = Visibility.Collapsed;
// タスクバーアイコンを処理中表示にする
taskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Indeterminate;
}
else
{
// 処理終り
// 画面全体を有効化
this.IsEnabled = !loading;
// 処理中メッセージを隠す
loadingText.Visibility = Visibility.Collapsed;
// リストを表示
listView.Visibility = Visibility.Visible;
// タスクバーアイコンを通常に戻す
taskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None;
}
}
/// <summary>
/// CSVファイル読み込みタスク
/// </summary>
/// <param name="filePath">CSVファイルパス</param>
/// <returns></returns>
private Task ReadCsvTask(string filePath)
{
return Task.Run(() => { ReadCsv(filePath); });
}
openMenu_Click
메서드를 수정합니다.
메소드 정의(수정 전)private void openMenu_Click
메소드 정의(수정 후)private async void openMenu_Click
CSV 읽기 처리(수정 전)this.IsEnabled = false;
// CSV読み込み
ReadCsv(dlg.FileName);
this.IsEnabled = true;
CSV 읽기 처리(수정 후)SetLoadingUI(true);
// CSV読み込み
await ReadCsvTask(dlg.FileName);
SetLoadingUI(false);
처리의 흐름은 await
를 붙인 ReadCsvTask
메소드가 불려 가면(자) openMenu_Click
메소드를 일단 빠져나갑니다 (다른 병렬로 움직이고 있는 처리가 있으면 그쪽을 합니다).
그리고, ReadCsvTask
메소드가 종료하면(자) 그 아래의 처리가 실행됩니다.
여기에서는, 무거운 처리( ReadCsvTask
)를 실행하기 직전에 화면을 처리중 표시로 하고, 무거운 처리가 끝나면 처리중 표시를 되돌리고 있습니다.
■ 움직여 보자
실행해 보겠습니다.
가장 큰 전국 일괄 데이터를 읽어 보겠습니다.
작업 표시줄 표시,
↓
처리 중에 바뀌고,
목록 보기가 숨겨지고 대신 처리 중인 텍스트가 표시됩니다.
이전과 달리 로드 중에도 창을 이동하거나 크기를 조정할 수 있습니다.
로드가 끝나면 목록 보기가 표시됩니다.
오시마
■참고 사이트
<TextBlock x:Name="loadingText" Grid.Row="1" TextWrapping="Wrap" Text="読み込み中・・・" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Visibility="Collapsed"/>
<Window.TaskbarItemInfo>
<TaskbarItemInfo x:Name="taskbarInfo"/>
</Window.TaskbarItemInfo>
// 複数のスレッドからのアクセスを有効化
BindingOperations.EnableCollectionSynchronization(this.ZipRecords, new object());
/// <summary>
/// データ読み込み中の画面表示
/// </summary>
/// <param name="loading">データ読み込み中の時にtrue, 読み込み終わったらfalseを設定する</param>
private void SetLoadingUI(bool loading)
{
if (loading)
{
// 処理中
// 画面全体を無効化
this.IsEnabled = !loading;
// 処理中メッセージを表示
loadingText.Visibility = Visibility.Visible;
// リストを隠す
listView.Visibility = Visibility.Collapsed;
// タスクバーアイコンを処理中表示にする
taskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Indeterminate;
}
else
{
// 処理終り
// 画面全体を有効化
this.IsEnabled = !loading;
// 処理中メッセージを隠す
loadingText.Visibility = Visibility.Collapsed;
// リストを表示
listView.Visibility = Visibility.Visible;
// タスクバーアイコンを通常に戻す
taskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None;
}
}
/// <summary>
/// CSVファイル読み込みタスク
/// </summary>
/// <param name="filePath">CSVファイルパス</param>
/// <returns></returns>
private Task ReadCsvTask(string filePath)
{
return Task.Run(() => { ReadCsv(filePath); });
}
private void openMenu_Click
private async void openMenu_Click
this.IsEnabled = false;
// CSV読み込み
ReadCsv(dlg.FileName);
this.IsEnabled = true;
SetLoadingUI(true);
// CSV読み込み
await ReadCsvTask(dlg.FileName);
SetLoadingUI(false);
실행해 보겠습니다.
가장 큰 전국 일괄 데이터를 읽어 보겠습니다.
작업 표시줄 표시,
↓
처리 중에 바뀌고,
목록 보기가 숨겨지고 대신 처리 중인 텍스트가 표시됩니다.
이전과 달리 로드 중에도 창을 이동하거나 크기를 조정할 수 있습니다.
로드가 끝나면 목록 보기가 표시됩니다.
오시마
■참고 사이트
<< 첫 번째 기사 < 이전 기사 다음 기사 >
Reference
이 문제에 관하여(Windows GUI 프로그래밍 시작 14 처리 중 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kosen-amai/items/58e597c98967ca34ecd1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)