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();
}