LoginSignup
2
8

More than 3 years have passed since last update.

フォームアプリケーションに疑似Update関数を実装し,コンソールで確認する

Posted at

概要

WindowsフォームアプリケーションでUnityのUpdate関数のような毎フレーム自動更新する環境を実装してみました
また,フォームアプリケーションでコンソールを使う方法も今回調査してわかったので共有

環境

windows10
Visual Studio 2019

実装

プロジェクトの作成までは過去記事を参照してください

コンソールをフォームアプリケーションで実装する

1.プロジェクトを作成したらまずform1を右クリックして,コードの表示を選択してコードを表示する

2.以下のコードを入力

Form1.cs
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が使用可能になる
image.png

Update関数の実装

Form1_Activatedイベントを追加し,そこでWhile(true)を回す方法もあるが,邪魔になりそうなので今回はbackgroundWorkerを使用し,個別にUpdate関数を実装することにする

1.ツールボックスから「backgroundWorker」をform1上にD&Dし,ダブルクリックしてbackgroundWorker1_DoWorkイベントを追加する

2.backgroundWorker1_DoWorkに以下のコードを入力

Form1.cs
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            while (!backgroundWorker1.CancellationPending)
            {
                Console.WriteLine("hoge");
            }
        }

3.BackgroundWorkerのプロパティタブで下図のように「WorkerReportsProgress」「WorkerSupportsCancellation」の2つをfalseからtrueに変更する
image.png

4.FormClosingイベントを追加し,下記コードを追加(詳しいやり方は過去記事参照)

Form1.cs
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //スレッドの終了を待機
            backgroundWorker1.CancelAsync();
            Application.DoEvents();
        }

5.Form1関数に

backgroundWorker1.RunWorkerAsync();

を書き加えて完成
一応namespace以下のコード全体を載せておきます

Form1.cs
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っぽい感覚を少しでも得られるかも

参考URL

コンソールの表示方法
https://www.wareko.jp/blog/output-text-string-to-console-window-with-windows-form-application-in-c-sharp

2
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
8