Отправка массива int с помощью backgroundworker ReportProgress в переполнении стека

Я пытаюсь отправить массив int из потока backgroundworker в мой основной поток с помощью метода ReportProgress ().

Теперь, если я попытался отправить целое число или строку, все работало нормально. но если я попытаюсь использовать массив 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);
}

0

Решение

невозможно преобразовать аргумент 2 из ‘int *’ в ‘System :: Object ^

C ++ / CLI позволяет использовать неуправляемые типы, такие как int foo[5], Но они не могут быть преобразованы в System :: Object, тип аргумента ReportProgress (). Вы должны использовать управляемый массив здесь. Fix:

 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 с помощью приведения, который затем может быть помещен в объект. Но в конкретном случае ReportProgress () это получится очень плохо, что переменная давно ушла к тому времени, когда событие ProgressChanged начнет выполняться. ReportProgress не ожидает завершения обработки обработчика событий, он использует Control :: BeginInvoke () вместо Invoke (). Использование управляемого массива, который хранится в куче, гарантирует, что это не может пойти не так, и массив останется действительным. Затем сборщик мусора обеспечивает освобождение массива, когда он больше не используется.

1

Другие решения

Проблема может заключаться в том, что параметр foo, который вы передаете в функцию ReportProgress, является целочисленным указателем. Было бы полезно, если бы вы опубликовали функцию ReportProgress.

1