我创建了一个“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 ++;
}
} ;
}
答案 0 :(得分:4)
这对非常不合适用于线程。它有很多问题,它正在燃烧100%的核心而且没有对所有这些cpu周期做任何有用的事情。从工作线程更新Text属性是错误的,并且会为您购买由Winforms抛出的InvalidOperationException,因为从创建控件的线程以外的线程更新控件的属性是非法的。
最糟糕的是,你所做的只是根本不需要线程。您只需要一个线程来完成需要很长时间的工作,这个时间足以让用户界面陷入困境。超过一秒左右。更新控件的Text属性需要几个纳秒。你至少需要5个数量级的线程。
使用TextBox'TextChanged或Leave事件。