C++ cli 如何在c++;?
我有一个C++ cli 如何在c++;?,c++-cli,backgroundworker,C++ Cli,Backgroundworker,我有一个后台工作人员不断地从USB设备读取数据。我想解析这些数据,然后将其反馈给我的主GUI线程,以更新绘图并将其保存到文件中 我怀疑这样做的方法是使用ReportProgress,但我不确定如何根据需要传递对象 下面是我尝试做的一个片段: class Datapacket { public: int Val1; double Val2; } backgroundWorker_DoWork(Object^ sender,DoWorkEventArgs^
后台工作人员
不断地从USB设备读取数据。我想解析这些数据,然后将其反馈给我的主GUI线程,以更新绘图并将其保存到文件中
我怀疑这样做的方法是使用ReportProgress
,但我不确定如何根据需要传递对象
下面是我尝试做的一个片段:
class Datapacket
{
public:
int Val1;
double Val2;
}
backgroundWorker_DoWork(Object^ sender,DoWorkEventArgs^ e)
{
// readUSB
.........
// create Datapacket with values from usb stream:
Datapacket dp;
dp.Val1 = 5;
dp.Val2 = 34.6;
backgroundWorker->ReportProgress(0, dp); // this bit fails to compile
}
backgroundWorker_ProgressChanged(Object^ sender, ProgressChangedEventArgs^ e)
{
Datapacket dp = e.dp ??????
// update gui, etc
textBox_Data->Text = dp.Val1.ToString();
}
<>我通常用C语言,所以在C++中跳入这个词是一个小的头痛,因为它是p> 你就在附近Datapacket
不是.NET引用类型(类),我假设您不想在它超出范围时处理它。将其更改为ref class
,只需将^
添加到您的backgroundWorker\u工作中即可(并在适当情况下使用->
更改
):
在事件处理程序中,只需将UserState
属性强制转换为原始类型(并在适当的情况下使用->
更改):
backgroundWorker\u ProgressChanged(对象^sender,ProgressChangedEventArgs^e)
{
数据包^dp=动态广播(e->UserState);
//更新gui等
textBox_Data->Text=dp->Val1.ToString();
}
不要忘记将WorkerReportsProgress
设置为true
您不能传递非托管类的对象,它不会从System::object继承。当事件处理程序运行时,它也会被破坏,悬空指针是主要的bug生成器。这里没有任何理由避免将数据包声明为ref类
。忽略以下内容-我在错误的位置定义了我的类-感谢您的帮助。太近了!!然而,当我尝试编译时,当我尝试实例化它时,会得到一个错误“errorC2061:syntax error:identifier'Datapacket'”。
backgroundWorker_DoWork(Object^ sender,DoWorkEventArgs^ e)
{
Datapacket^ dp = gcnew Datapacket();
dp->Val1 = 5;
dp->Val2 = 34.6;
backgroundWorker->ReportProgress(0, dp);
}
backgroundWorker_ProgressChanged(Object^ sender, ProgressChangedEventArgs^ e)
{
Datapacket^ dp = dynamic_cast<Datapacket^>(e->UserState);
// update gui, etc
textBox_Data->Text = dp->Val1.ToString();
}