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