Здравствуйте, я пытаюсь создать приложение, которое может считывать данные, обрабатывать их и отображать на графике в режиме реального времени, пока я не нажму клавишу ESC, которая не остановит приложение от чтения и обработки дополнительных данных. Я создал это приложение в Visual C++/CLR:
Мое приложение для обработки данных и построения графиков в реальном времени а>
Когда я нажимаю кнопку анализа данных (см. рисунок). Данные считываются и обрабатываются (на основе результатов в окне консоли), но мой график в моем графическом интерфейсе не обновляется в режиме реального времени. Он обновляется только до тех пор, пока я не остановлю приложение от чтения и обработки каких-либо данных. Я знаю, что проблема как-то связана с потоками. Я полагаю, что запускаю чтение и обработку данных в том же потоке, что и обновление графического интерфейса. Ниже приведен код, в котором я выполняю сбор и обработку данных и обновления графического интерфейса:
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
vector<int> test;
test.push_back(1);
PD.setChannels(test);
//Grab and process data until the escape key is pressed
while (!GetAsyncKeyState(VK_ESCAPE)) {
PD.refreshBufferSize();
PD.grabDataFromBuffer();
vector<double> fireRates = PD.getFireRates();
//Debug code to print to console
for (int i = 0; i < fireRates.size(); i++) {
cout << fireRates[i] << endl;
}
Sleep(10); //wait 10 ms before getting the next buffer of data
//update GUI below
vector<int> channels = PD.getChannels();
for (int i = 0; i < channels.size(); i++) {
chart1->Series["Fire Rate"]->Points->AddXY(channels[i], fireRates[i]);
}
}
}
Я пробовал искать решения и нашел материал, говорящий об использовании методов BeginInvoke, делегата и Invoke, но большинство из них написаны на С# и их очень трудно понять. Причина, по которой я использую C++, заключается в том, что я использую некоторые DLL-файлы для вызова определенных функций, которые помогают мне получать данные, которые я хочу обработать и проанализировать, а C#, по моему опыту, плохо работает при попытке использовать DLL-файлы. Кроме того, документация и примеры, которые я нашел о том, как использовать методы в C++, которые я упомянул, не очень ясны или плохо переводятся на C++.
Мой вопрос: как я могу обновить свою диаграмму графического интерфейса в режиме реального времени в C++/CLR? Можно ли это сделать с помощью C++/CLR? Если да, можете ли вы привести пример? Ваша помощь очень ценится! Спасибо!