Как изменить текст метки формы, которая открывается в другой ветке?

Я запустил форму в новом потоке из-за некоторых проблем с запаздыванием графического интерфейса (форма перестает отвечать). Этот поток запускается, когда вызывается функция (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());
}

Теперь проблема заключается в изменении значений формы (Form1), таких как текст метки, индикатор выполнения и т. Д., Внутри цикла while. Есть ли способ изменить значения формы, которая открыта в другом потоке?

4

Решение

Проверить Контроль :: 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, Он идеально подходит для запуска асинхронной задачи с поддержкой отмены, а также реализует события для получения уведомлений о ходе выполнения и завершении задач.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]