2015
09
16
09
16
C#: 時間のかかる処理を実行しつつもGUIでのインプットを受け付ける
スクリーンキャプチャからGIFアニメを作るアプリをちょいと作っておきたかった。
やり方としてスクショを一定時間ずつ撮ってGIFにして、それをGIFアニメの形式になるようにファイルに加えていって。そういうわけでGUIに中断ボタンをつけておき、ボタンクリックによってある変数がfalseになったらスクショ撮りをやめてGIFアニメを作るということがしたい。中断ボタンが押されるまでは(もちろんメモリ容量の限界があるのでフレーム数の限度も設けておくが)一定の時間間隔でスクショを撮り続ける。一定の時間間隔で撮り続けるということを実行するため、ループを回しその中での処理が特定の時間間隔になるように、一時停止を入れなければならない。
上記のような時間間隔の調整を別スレッドを立てたりせずに同期実行すると、Sleepによって処理が止まる。処理が止まるというのはGUIでのインプット待ちという処理までとまるということ。つまり変数screenCap_continueが書き換えられずに無限ループ。そこでGUIのインプット待機を続行するために非同期処理をこのあたりに適用した。Taskとasync、awaitを使うことで非同期処理の導入が楽になっている。
やり方としてスクショを一定時間ずつ撮って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;
}
スポンサーサイト