В настоящее время я работаю над приложением, которое должно использовать форму, чтобы заблокировать пользователя от использования основной формы на несколько секунд. Хотя запуск кода в основном потоке, похоже, в порядке, метки в всплывающей форме не отображаются примерно в течение секунды, когда появляется форма. Я думал, что если я запустил эту форму в отдельном потоке, рендеринг будет намного более гладким. Теперь рендеринг настолько плавный, что форма исчезает сразу после рендеринга. Таймер установлен на пять секунд, при этом на экране отображается метка. Вот соответствующий код, вызывающий новую нить и форму:WinForm исчезает в многопоточном приложении C++/CLI
System::Void MainScreen::runGame(int playerTurn) {
Thread^t = gcnew Thread(gcnew ThreadStart(gcnew MainScreen(),
&MainScreen::showModalDialog));
t->Start();
t->Join();
InitializeDice();
startTimer();
}
System::Void MainScreen::showModalDialog() {
GetReady^gr = gcnew GetReady();
gr->showModalPopup();
}
А вот код в виде:
public:
GetReady(void)
{
InitializeComponent();
}
System::Void showModalPopup() {
this->Show();
startTimer();
}
private: System::Void timerPrep_Tick(System::Object^ sender, System::EventArgs^ e) {
ts = ts->Subtract(TimeSpan(0, 0, 1));
if (ts->TotalSeconds <= 0) {
finishTimer();
} else {
lblTimer->Text = ts->ToString("mm\\:ss");
}
}
System::Void startTimer() {
array<String ^>^ minSec = gcnew array<String ^>(2);
minSec = lblTimer->Text->Split(':');
ts = gcnew TimeSpan(0, Convert::ToInt32(minSec[0]), Convert::ToInt32(minSec[1]));
Thread::Sleep(900);
timerPrep->Start();
}
System::Void finishTimer() {
timerPrep->Stop();
lblTimer->Text = "GO!!!";
Thread::Sleep(900);
this->Close();
}
Мой идеальным решением было бы использовать нить, чтобы создать новую форму, так что рендеринг как в основной форме, так и в всплывающей форме является плавным.
Что я пробовал:
- Перемещение this-> Show() каждый, где я могу думать, чтобы положить его.
- Я добавил t-> Join(), чтобы посмотреть, пытается ли основной поток вернуть основное окно в фокус. Поток t по-прежнему выполняется, и таймер по-прежнему работает с Объединением, блокируя ввод пользователя в течение пяти секунд, но блокировать экран нечем.
- Я прочитал несколько вопросов о SO, я думаю, что наиболее актуальным является WinForms multithreading issue - хотя я чувствую, что это может быть излишним для этой ситуации.
Если у вас есть идеи относительно того, что мне нужно сделать, чтобы иметь гладкую визуализацию для обеих форм, пожалуйста, дайте мне знать. Благодаря!
Вы установили свойство _Interval_ таймера?Он не показан в примере кода. – Jairo
Извините - он был установлен в 1000 в дизайнере формы. 'this-> timerPrep-> Interval = 1000; \t \t \t это-> timerPrep-> Tick + = gcnew System :: EventHandler (это и & GetReady :: timerPrep_Tick); ' – floppsb