Я пытаюсь отправить массив 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);
}
невозможно преобразовать аргумент 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 (). Использование управляемого массива, который хранится в куче, гарантирует, что это не может пойти не так, и массив останется действительным. Затем сборщик мусора обеспечивает освобождение массива, когда он больше не используется.
Проблема может заключаться в том, что параметр foo, который вы передаете в функцию ReportProgress, является целочисленным указателем. Было бы полезно, если бы вы опубликовали функцию ReportProgress.