如何 return 来自 C++ BackgroundWorker 的数据?

How to return data from a BackgroundWorker in c++?

我有一个 BackgroundWorker 不断从 USB 设备读取数据。我想解析该数据,然后将其反馈给我的主 GUI 线程以更新绘图并将其保存到文件中。

我怀疑这样做的方法是使用 ReportProgress,但我不确定如何按要求传递 object

这是我正在尝试做的事情的片段:

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++ 中深入研究这个问题确实有点让人头疼!

就在附近。 Datapacket 不是 .NET 引用类型 (class),我假设您不想在它超出范围时处置它。将其更改为 ref class 并在 backgroundWorker_DoWork 中添加 ^(并在适当的地方将 . 更改为 ->):

backgroundWorker_DoWork(Object^  sender,DoWorkEventArgs^  e) 
{
    Datapacket^ dp = gcnew Datapacket();
    dp->Val1 = 5;
    dp->Val2 = 34.6;

    backgroundWorker->ReportProgress(0, dp);
}

在您的事件处理程序中,您只需将 UserState 属性 转换为原始类型(并在适当的地方将 . 更改为 ->):

backgroundWorker_ProgressChanged(Object^  sender, ProgressChangedEventArgs^  e)
{
    Datapacket^ dp = dynamic_cast<Datapacket^>(e->UserState);

    // update gui, etc
    textBox_Data->Text = dp->Val1.ToString();
}

不要忘记将 WorkerReportsProgress 设置为 true