主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#: 時間のかかる処理を実行しつつもGUIでのインプットを受け付ける

                
 スクリーンキャプチャからGIFアニメを作るアプリをちょいと作っておきたかった。
 やり方としてスクショを一定時間ずつ撮ってGIFにして、それをGIFアニメの形式になるようにファイルに加えていって。そういうわけでGUIに中断ボタンをつけておき、ボタンクリックによってある変数がfalseになったらスクショ撮りをやめてGIFアニメを作るということがしたい。中断ボタンが押されるまでは(もちろんメモリ容量の限界があるのでフレーム数の限度も設けておくが)一定の時間間隔でスクショを撮り続ける。一定の時間間隔で撮り続けるということを実行するため、ループを回しその中での処理が特定の時間間隔になるように、一時停止を入れなければならない。
while (screenCap_continue)
{
Thread.Sleep(delayTime); //GetScreenが一定の時間間隔で行われるように調整
GetScreen();
}


 上記のような時間間隔の調整を別スレッドを立てたりせずに同期実行すると、Sleepによって処理が止まる。処理が止まるというのはGUIでのインプット待ちという処理までとまるということ。つまり変数screenCap_continueが書き換えられずに無限ループ。そこでGUIのインプット待機を続行するために非同期処理をこのあたりに適用した。Taskとasync、awaitを使うことで非同期処理の導入が楽になっている。

private void CaptureScreen()
{
while (screenCap_continue)
{
Thread.Sleep(delayTime); //GetScreenが一定の時間間隔で行われるように調整
GetScreen();
}
}

private async void MakeGifAnime()
{
await Task.Run(() =>
{
CaptureScreen();
}
}

private void CancelButtonPressed(object sender, EventArgs e)
{
screenCap_continue = false;
}
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。