2013年3月18日 星期一

C# - 如何在靜態函數(static function)中呼叫表單物件?

為了要讓C# 裡面的 static function 可以存取表單裡面的物件需要...
1. 先把表單的 instance 傳進 thread 中。
2. 當 thread 收到這個 instance的時候再傳進 Static function。
3. Static function 收到後利用這個 instance 呼叫一個中繼的非 static function。
4. 這個中繼的非 static function 再利用委任(BeginInvoke) 的方法呼叫一個非靜態的 function 去更改表單物件。

PS. 繞了半天...終於成功了。一開始靜態函數無法直接更改所以改用委任。但是因為是靜態函數所以無法呼叫 BeginInvoke 。所以先藉由外部傳進來的 instace 呼叫一個非靜態的函數來委任。網路上一般都會利用傳event的方法或也可以再做一隻Thread 不斷的去更新。忽然靈機一動...把委任跟把 thread 傳進 instance的方法結合在一起終於成功。

namespace ShowStringDemo

{
    public partial class Demoform : Form

    {

        /* function */

        delegate void ShowDataToFormDelegate(string show_string);

        ShowDataToFormDelegate ShowDataToFormDelegateFunc;   

        /* thread define */

        public Thread DemoThread;

        public Demoform()

        {

            InitializeComponent();         

        }

        private void Demoform_Load(object sender, EventArgs e)

        {

            DemoThread= new Thread(new ParameterizedThreadStart(DemoThreadMain));

            DemoThreadMain.Start(this);

        }

        public static void DemoThreadMain(object sender)

        {

            while(true)

            {

                StaticShow(sender);

                Thread.sleep(500);

            }

        }

        public static void StaticShow(object sender)

        {

            Demoform instance = ( Demoform ) sender;

            instance.ShowStates("test");

        }

        public void ShowStates(string show_string)

        {

            ShowDataToFormDelegateFunc = new ShowDataToFormDelegate(OutputToLabStatus);

            BeginInvoke(ShowDataToFormDelegateFunc, show_string);

        }

        void OutputToLabStatus(string show_string)

        {

            LabStatus.Text = show_string;

        }

    }

}

參考資料 : http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/5cabca0a-b8cc-4aaf-a77e-c45cb309f5db/

沒有留言: