这段代码可能与正确的方法相去甚远。我只是模拟了我在 C# 中为跨线程更新所做的事情。实际答案来自评论。
初始化表单,设置委托,启动第二个线程:
public ref class Form_1 : public System::Windows::Forms::Form
{
public:
CL* c;
delegate System::Void CrossThreadUpdate(Object^ obj);
CrossThreadUpdate^ crossThreadUpdate;
void update(Object^ obj);
Thread^ t;
void updateTextArea(String^ text);
void initCL();
Form_1(void)
{
InitializeComponent();
crossThreadUpdate = gcnew CrossThreadUpdate(this, &Form_1::update);
t = gcnew Thread(gcnew ThreadStart(this, &Form_1::initCL));
t->Start();
//
//TODO: Add the constructor code here
//
}
线程做它的事情,然后让我们知道它完成了
void Form_1::initCL()
{
c = new CL();
updateTextArea("CL READY");
}
更新表格
void Form_1::update(Object^ obj) {
array<Object^>^ arr = (array<Object^>^)obj;
int^ op = safe_cast<int^>(arr[0]);
switch(*op)
{
case 1:
String^ text = safe_cast<String^>(arr[1]);
wstring stringConvert = L"";
MarshalString(text, stringConvert);
wcout << stringConvert << endl;
this->textBox1->Text += text + "\r\n";
break;
}
}
void Form_1::updateTextArea(String^ text) {
array<Object^>^ args = gcnew array<Object^>(1);
array<Object^>^ inArgs = gcnew array<Object^>(2);
inArgs[0] = 1;
inArgs[1] = text;
args[0] = inArgs;
this->Invoke(crossThreadUpdate, args);
}