如何 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
。
我有一个 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
。