【发布时间】:2016-06-17 15:56:55
【问题描述】:
您好,我正在尝试创建一个可以读取数据、处理数据并将其实时绘制在图表上的应用程序,直到我按下阻止应用程序读取和处理更多数据的 ESC 键。我在 Visual C++/CLR 中创建了这个应用程序:
My Real Time Data Processing and Plotting App
当我点击分析数据按钮时(见图)。正在读取和处理数据(基于控制台窗口中的结果),但我的 GUI 中的图表没有实时更新。它只会更新,直到我停止应用程序读取和处理更多数据。我知道这个问题与线程有关。我相信我在更新 GUI 的同一线程上运行数据读取和处理。下面是我进行数据抓取和处理以及 GUI 更新的代码:
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、delegate 和 Invoke 方法,但它们中的大多数都是用 C# 编写的,而且很难理解。我使用 C++ 的原因是因为我正在使用一些 DLL 文件来调用某些函数,这些函数可以帮助我获取我想要处理和分析的数据,而根据我的经验,C# 在尝试使用 DLL 文件时会发挥很大作用。此外,我找到的关于如何在 C++ 中使用我提到的方法的文档和示例不是很清楚,或者不能很好地转换为 C++。
我的问题是如何在 C++/CLR 中实时更新我的 GUI 图表?是否可以使用 C++/CLR 来做到这一点?如果是这样,你能给我一个例子吗?非常感谢您的帮助!谢谢!
【问题讨论】:
标签: .net user-interface visual-c++ clr real-time-updates