概要
WindowsフォームアプリケーションでUnityのUpdate関数のような毎フレーム自動更新する環境を実装してみました
また,フォームアプリケーションでコンソールを使う方法も今回調査してわかったので共有
環境
windows10
Visual Studio 2019
実装
プロジェクトの作成までは過去記事を参照してください
コンソールをフォームアプリケーションで実装する
1.プロジェクトを作成したらまずform1を右クリックして,コードの表示を選択してコードを表示する
2.以下のコードを入力
public partial class Form1 : Form
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();
public Form1()
{
InitializeComponent();
AllocConsole();
Console.WriteLine("hogehoge");
}
}
実行すると,フォームとコンソールウィンドウの2つが表示され,Console.WriteLineが使用可能になる
Update関数の実装
Form1_Activatedイベントを追加し,そこでWhile(true)を回す方法もあるが,邪魔になりそうなので今回はbackgroundWorkerを使用し,個別にUpdate関数を実装することにする
1.ツールボックスから「backgroundWorker」をform1上にD&Dし,ダブルクリックしてbackgroundWorker1_DoWorkイベントを追加する
2.backgroundWorker1_DoWorkに以下のコードを入力
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)
{
Console.WriteLine("hoge");
}
}
3.BackgroundWorkerのプロパティタブで下図のように「WorkerReportsProgress」「WorkerSupportsCancellation」の2つをfalseからtrueに変更する
4.FormClosingイベントを追加し,下記コードを追加(詳しいやり方は過去記事参照)
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//スレッドの終了を待機
backgroundWorker1.CancelAsync();
Application.DoEvents();
}
5.Form1関数に
backgroundWorker1.RunWorkerAsync();
を書き加えて完成
一応namespace以下のコード全体を載せておきます
public partial class Form1 : Form
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();
public Form1()
{
InitializeComponent();
AllocConsole();
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)
{
Console.WriteLine("hoge");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//スレッドの終了を待機
backgroundWorker1.CancelAsync();
Application.DoEvents();
}
}
実行結果
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
...
失礼しました
これでUnityっぽい感覚を少しでも得られるかも