gpt4 book ai didi

c++ - 在 C++ 中通过 backgroundworker ReportProgress 发送 int 数组

转载 作者:行者123 更新时间:2023-11-28 03:02:06 26 4
gpt4 key购买 nike

我正在尝试使用 ReportProgress() 方法将一个 int 数组从 backgroundworker 线程发送到我的主线程。

现在,如果我尝试发送一个整数或一个字符串,它工作正常。但如果我尝试使用 int 数组,它似乎不起作用。

我该如何解决这个问题?

private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
//...do work..
int foo[5] = { 16, 2, 77, 40, 12071 };
backgroundWorker1->ReportProgress(99, foo);
}

最佳答案

cannot convert argument 2 from 'int *' to 'System::Object ^

C++/CLI 允许您使用非托管类型,例如 int foo[5]。但它们不能转换为 System::Object,即 ReportProgress() 的参数类型。您必须在此处使用托管数组。修复:

 array<int>^ foo = gcnew array<int> { 16, 2, 77, 40, 12071 };
backgroundWorker1->ReportProgress(99, foo);

然后您的 ProgressChanged 事件处理程序需要将对象转换回数组:

 array<int>^ foo = safe_cast<array<int>^>(e->UserState);

也许值得注意的是,您的原始 int foo[5] 实际上可以通过强制转换转换为 IntPtr,然后可以将其装箱在 Object 中。但在 ReportProgress() 的特定情况下,结果非常很差,在 ProgressChanged 事件开始运行时,变量早已消失。 ReportProgress 不等待事件处理程序完成,在幕后它使用 Control::BeginInvoke() 而不是 Invoke()。使用存储在堆上的托管数组可确保这不会出错并且数组保持有效。然后,垃圾收集器确保在不再使用该数组时将其释放。

关于c++ - 在 C++ 中通过 backgroundworker ReportProgress 发送 int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com