У меня есть форма Windows, которая запускает тест EngTest_F (), когда вы нажимаете кнопку в форме. Эта функция вызывается из собственной библиотеки DLL. Я также создал фонового работника в коде управляемой формы, который вызывает функцию GetSicStatusMsg для обновления текстового поля в форме.
В моей родной функции EngTest_F у меня есть функции, которые помещают текстовые обновления в очередь строк. Затем, когда вызывается GetSicStatusMsg, он проверяет очередь на наличие строк и печатает их в richTextBox в форме окна.
Мне нужно, чтобы фоновый работник постоянно запускал GetSicStatusMsg, чтобы я мог в режиме реального времени отслеживать ход выполнения теста. На самом деле происходит запуск EngTest_F, а затем примерно через секунду после его завершения все сообщения о состоянии распечатываются сразу.
Есть ли способ выполнить то, что я хочу сделать? Или есть более простой подход? Я впервые использую потоки, и документации немного не хватает.
private: void GetSicStatusMsg()
{
try
{
while(GetNumStatusMsgs())
{
String^ Status = gcnew String(GetStatusMsg().c_str());
DisplayStatus(Status, DISPLAY_SIC);
}
}
catch(SIC_Error *Err)
{
if(Err->ErrorCode != NO_CONTROLLER)
{
String^ Error = gcnew String(Err->ErrorMsg.c_str());
DisplayStatus(Error,DISPLAY_SIC);
}
}
catch(Exception ^Ex)
{
DisplayStatus(Ex->Message,DISPLAY_SIC);
}
}
private: System::Void button1_Click(System::Object^ /*sender*/, System::EventArgs^ /*e*/)
{
this->button1->Enabled = false;
// Enable the Cancel button while
// the asynchronous operation runs.
this->button4->Enabled = true;
// Start the asynchronous operation. Needs to be running while EngTest_F is running
backgroundWorker1->RunWorkerAsync();
EngTest_F();
}
private: System::Void backgroundWorker1_ProgressChanged(System::Object^ sender, System::ComponentModel::ProgressChangedEventArgs^ e)
{
GetSicStatusMsg();
}
private: void backgroundWorker1_RunWorkerCompleted( Object^ sender, RunWorkerCompletedEventArgs^ e )
{
// Enable the Start button.
button1->Enabled = true;
// Disable the Cancel button.
button4->Enabled = false;
}
private: void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);
worker->ReportProgress(0);
}