如何在c ++中从BackgroundWorker返回数据?

时间:2015-05-19 10:32:09

标签: c++-cli backgroundworker

我有一个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 ++中深入研究它是一件轻微的麻烦!

1 个答案:

答案 0 :(得分:2)

附近。 Datapacket 不是 .NET引用类型(类),我假设您不希望在超出范围时处置它。将其更改为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