使用线程制作事件

时间:2013-09-14 13:13:35

标签: .net multithreading events c++-cli

我创建了一个“Windows窗体”和第二个“线程”。

  • 我的表单有一个更改变量值的按钮。

  • 我的第二个线程使用不可阻挡的循环来分析该变量。

所以这是一个事件,当该变量的值发生变化时更改表单的文本,但是我不能在“ThreadProcess”函数的块中使用我的表单或任何控件,因为它在此之后被声明。

我也不能在它之前声明我的表单,因为我需要在表单构造函数中使用“ThreadClass”。那我该怎么办?

using namespace System;
using namespace System :: Threading;
using namespace System :: Windows :: Forms;

namespace Program
{
    static int Number = 0;

    ref class ThreadClass
    {
        public : void ThreadProcess ()
        {
            int SavedNumber = Number;
            while (1)
            {
                if(Number != SavedNumber)
                {
                    this -> Text = "Changed";
                    SavedNumber = Number;
                }
                else
                    this -> Text = "Nothing Yet";
            }
        }
    } ;

    ref class MainForm : Form
    {
        Button ^ ChangeButton;
        Thread ^ EventThread;
        ThreadClass ^ EventThreadClass;
        public : MainForm ()
        {
            EventThreadClass = gcnew ThreadClass ;
            EventThread = gcnew Thread ( gcnew ThreadStart ( EventThreadClass, & ThreadClass :: ThreadProcess ) ) ;
            EventThread -> IsBackground = true;
            ChangeButton = gcnew Button ();
            ChangeButton -> Click += gcnew EventHandler (this, & MainForm :: CloseButtonEventProcess);
            Controls -> Add (ChangeButton);
            EventThread -> Start ();
        }
        void CloseButtonEventProcess (Object ^ Sender , EventArgs ^ EA)
        {
            Number ++;
        }
    } ;
}

1 个答案:

答案 0 :(得分:4)

这对非常不合适用于线程。它有很多问题,它正在燃烧100%的核心而且没有对所有这些cpu周期做任何有用的事情。从工作线程更新Text属性是错误的,并且会为您购买由Winforms抛出的InvalidOperationException,因为从创建控件的线程以外的线程更新控件的属性是非法的。

最糟糕的是,你所做的只是根本不需要线程。您只需要一个线程来完成需要很长时间的工作,这个时间足以让用户界面陷入困境。超过一秒左右。更新控件的Text属性需要几个纳秒。你至少需要5个数量级的线程。

使用TextBox'TextChanged或Leave事件。