かってきままに!

わたくし、とんちゃんが日々の話題をかってきままに記していきます。

別スレッドからフォーム上のコントロールを操作する

2010-12-14 17:54:47 | C++/CLI


        

         //別スレッドからメインスレッドのフォーム上のコントロールのメソッドを呼ぶためにデリゲートを定義

         //引数が必要な場合
        delegate void SetFocusDelegate1(int);

        //引数が必要ない場合  
        delegate void SetFocusDelegate2();


        //別スレッドからメインスレッドのフォーム上のコントロールのメソッドを呼ぶためのデリゲートに登録するメソッドを定義
        
        //引数有の場合
        void SetFocus1(int i)  {

            //別スレッドから呼ばれた場合は if文内に入る
            if (this->InvokeRequired)  {
              
                MessageBox::Show("別スレッドから呼び出し" + i, "InvokeRequired");
               
                //別スレッドからコントロールのメソッドをそのまま呼ぶとエラー
                //this->textBox2->Focus();
               
                //別スレッドからの呼び出しによる、メインスレッドのフォーム上のコントロールのメソッドを呼ぶためのデリゲートに、実行するメソッドを登録
                SetFocusDelegate1^ focusDel = gcnew SetFocusDelegate1(this, &Form1::SetFocus1);
               
                //メインスレッドから SetFocus1() を実行してもらうために SetFocus1() が登録されたデリゲートを実行
                //二番目の引数にデリゲートに渡す引数を渡す
                this->Invoke(focusDel, i+1);

                //ここで return しないと下に流れて別スレッドから this->textBox2->Focus() が呼ばれてエラーとなる
                return;

            }


            //以下メインスレッド上から呼ばれた時の処理
            MessageBox::Show("メインスレッドから呼び出し" + i, "InvokeRequired");

            //メインスレッドからの呼び出しなのでエラーはでない
            this->textBox2->Focus();

            return;

        }


        //引数無の場合
        void SetFocus2()  {

            //別スレッドから呼ばれた場合は if文内に入る
            if (this->InvokeRequired)  {
             
                MessageBox::Show("別スレッドから呼び出し", "InvokeRequired");
               
                //別スレッドからコントロールのメソッドをそのまま呼ぶとエラー
                //this->textBox2->Focus();

                //メインスレッドから SetFocus1() を実行してもらうために SetFocus1() が登録されたデリゲートを実行

                //*デリゲートの定義も一度に行うこともできる
                this->Invoke(gcnew SetFocusDelegate2(this, &Form1::SetFocus2));

                return;

            }


            //以下メインスレッド上から呼ばれた時の処理
            MessageBox::Show("メインスレッドから呼び出し", "InvokeRequired");

            //メインスレッドからの呼び出しなのでエラーはでない
            this->textBox2->Focus();
           
            return;

        }

 

        //別スレッドで実行されるメソッドを定義
        //このメソッドは引数を取れない

        //SetFocusが引数有の場合
        void worker1(System::Object^ i)  {

            SetFocus1(safe_cast(i));

            return;

        }


        //引数無の場合
        void worker2()  {

            SetFocus2();

            return;

        }

 

    //「別スレッドでfocus引数有」ボタンが押されたとき
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

                 //別スレッドで実行するメソッドをデリゲートに登録(スレッドとして実行するメソッドに引数を渡す場合)
                 System::Threading::ParameterizedThreadStart^ s = gcnew System::Threading::ParameterizedThreadStart(this, &Form1::worker1);

                 //別スレッドで実行するデリゲートをスレッドとして作成
                 System::Threading::Thread^ t = gcnew System::Threading::Thread(s);

                 //スレッドスタート  引数は適当
                 t->Start(15);

             }


    //「メインスレッドでfocus引数有」ボタンが押されたとき
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {

                 this->SetFocus1(10);  //引数は適当

             }

   
    //「別スレッドでfocus引数無」ボタンが押されたとき
    private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {

                 //別スレッドで実行するメソッドをデリゲートに登録(スレッドとして実行するメソッドに引数を渡さない場合)
                 System::Threading::ThreadStart^ s = gcnew System::Threading::ThreadStart(this, &Form1::worker2);

                 //別スレッドで実行するデリゲートをスレッドとして作成
                 System::Threading::Thread^ t = gcnew System::Threading::Thread(s);

                 t->Start();

             }

   
    //「メインスレッドでfocus引数無」ボタンが押されたとき
    private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
                
                 this->SetFocus2();

             }


最新の画像もっと見る

コメントを投稿