-2

我创建了一个 "Windows Form" 和第二个 "Thread" 。

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

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

因此,这是一个在该变量的值发生更改时更改表单文本的事件,但我不能在该“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 ++;
        }
    } ;
}
4

1 回答 1

4

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

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

请改用 TextBox 的 TextChanged 或 Leave 事件。

于 2013-09-14T14:15:03.527 回答