gpt4 book ai didi

c++ - 如何更改在不同线程中打开的表单的标签文本?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:58 24 4
gpt4 key购买 nike

由于一些 GUI 滞后(表单变得无响应)问题,我在新线程中启动了一个表单。该线程在函数 (some_function()) 被调用时启动。比如……

/*========some_function=========*/
void some_function()
{
System::Threading::Thread^ t1;
System::Threading::ThreadStart^ ts = gcnew System::Threading::ThreadStart(&ThreadProc);
t1 = gcnew System::Threading::Thread(ts);
t1->Start();
while(condition)
{
Form1^ f1=gcnew Form1();
//some coding
//to change the values of a different form (Form1)
}
}

/*======ThreadProc=========*/
void ThreadProc()
{
Form1^ f1=gcnew Form1();
f1->Show(); //OR Application::Run(Form1());
}

现在的问题是关于在“while”循环中更改表单 (Form1) 的值,例如标签文本、进度条等。是否有任何方法可以更改在不同线程中打开的表单的值?

最佳答案

检查 Control::Invoke将方法扔到安全线程中以更改控件。要显示示例的形式:

public delegate void SwapControlVisibleDelegate(Control^ target);

public ref class Form1 : public System::Windows::Forms::Form
{
/*Ctor and InitializeComponents for Form1*/
/*...*/

protected :
virtual void OnShown(EventArgs^ e) override
{
__super::OnShown(e);
some_function();
}


void some_function()
{
System::Threading::Thread^ t1;
System::Threading::ThreadStart^ ts = gcnew ystem::Threading::ThreadStart(this, &Form1::ThreadProc);
t1 = gcnew System::Threading::Thread(ts);
t1->Start();

}

void ThreadProc()
{
Threading::Thread::Sleep(2000);
for each(Control^ c in this->Controls)
{
SwapVisible(c);
}
}


void SwapVisible(Control^ c)
{
if(c->InvokeRequired) // If this is not a safe thread...
{
c->Invoke(gcnew SwapControlVisibleDelegate(this, &Form1::SwapVisible), (Object^)c);
}else{
c->Visible ^= true;
}
}
}

这是如何将方法控制调用到安全线程中以进行更改。现在我已经阅读了您对该问题的评论。看看BackgroundWorker component ,它非常适合运行带有取消支持的异步任务,它还实现了事件以接收有关进度和任务结束的通知。

关于c++ - 如何更改在不同线程中打开的表单的标签文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542084/

24 4 0