魔界の村人の日記

主にゲームの感想やプログラミングのコードを書きなぐるだけ。

気になること1

開発環境 

OS:windows7 Professional

統合開発環境:Microsoft Visual Stadio 2013

.Net Framework 4.5

 

ちょいと並列処理で気になることがあったので忘れる前にメモっとく

        [STAThread]

        public static void Main()
        {
            Parallel.Invoke(mainRun,diceroll.main);
        }

        [STAThread]
        public static void mainRun()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new mainGUI());
        }

pulic static diceroll class{

        public static void main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new dicerollGUI());
        }

}

こんな感じで動かしたいのを Parallel で書いてみたものの、前者のmainのフォームと後者のdiceroll.mainのフォームで文字入力の振る舞いが違うという現象に出くわした。

無駄に[STAThread]を強調して書いても前者のフォームは日本語入力を受け付けず、後者のフォームは特に何も記述しなくても日本語入力を受け付ける。

やけくそで

        public static void Main()
        {
            Parallel.Invoke(diceroll.main,mainRun);
        }

という感じで先にdiceroll.mainを持ってくるとなぜか両方日本語入力を受け付けた。

ちなみに2つある[STAThread]を片方でも消すとまたmainのフォームが日本語入力を受け付けなくなった。不思議なことにdiceroll.mainは普通に受け付ける。

 

追記

単純にフォームを並列起動したら片方しか日本語入力受付ないっぽい?

なんかランダムでどっちかが入力拒否ってるな。

 

追記2

世の中には便利な機能があるそうで。diceroll.mainのフォームをモードレスで呼び出せば簡単に複数のフォームを出せるんですね。

メインのフォームにボタンを追加してそいつのハンドラーを

        private void Coll_dice_Click(object sender, EventArgs e)
        {
            dicerollGUI dicerollObj; // 子フォーム
            dicerollObj = new dicerollGUI(); // 子フォーム生成
            dicerollObj.Show(); // 子フォームを表示
        }

てな感じで書いてやれば簡単にフォームを複数出せました。

もちろん両方とも日本語入力できましたとさ。