#c #visual-studio #winforms #visual-c #clr
Вопрос:
Я работаю над небольшим проектом Windows Forms на C /CLR в сообществе Visual Studios 2019 с использованием .NET Framework 4.0, в котором у меня есть поле со списком и метка.
Приведенный ниже фрагмент кода работает нормально:
private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { label1-gt;Text = "comboBox1-gt;Text"; }
Но если я добавлю Sleep(1000);
«после label1-gt;Text = "comboBox1-gt;Text";
«, я ожидаю, что метка изменится до периода сна, но она изменится после окончания периода сна.
В общем, label1-gt;Text = "comboBox1-gt;Text";
выполняется после того, что находится ниже этой строки.
Для приведенного ниже фрагмента кода я хочу, чтобы программа перешла в спящий режим после изменения текста label1.
private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { label1-gt;Text = "comboBox1-gt;Text"; Sleep(1000); }
Комментарии:
1. То есть по замыслу этикетка не перекрашивается до тех пор, пока ОС не скажет ей об этом. Это не может произойти, пока поток пользовательского интерфейса спит. label1-gt;Обновить() до того, как сон ускорит это. Никогда не отключайте поток пользовательского интерфейса, всегда предпочитайте таймер.
Ответ №1:
Я понимаю, что ты имеешь в виду. Для реализации этой функции вам необходимо использовать a timer
. Вам нужно добавить a timer
в свою форму WinForm, а затем установить значение интервала равным 1000 в свойстве timer. Вам нужно использовать Start
для запуска таймера, вы можете обратиться к моему коду.
this-gt;timer1-gt;Interval = 1000;
this-gt;timer1-gt;Tick = gcnew System::EventHandler(this, amp;MyForm::timer1_Tick);
timer1-gt;Start();
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { label1-gt;Text = comboBox1-gt;Text; }