Компонент ActiveX Flash в приложении C # .NET 2.0 вызывает утечку памяти? - PullRequest
0 голосов
/ 21 апреля 2009

У нас есть CF / .NET 2.0 WinForm с элементом управления ActiveX ShockwaveFlashObject. Программа просматривает расписание контента и снова и снова отображает его на полноэкранном режиме управления, например:

axFlash.BringToFront();
axFlash.Movie = scheduleItem.FilePath;
axFlash.Show();
axFlash.Play();

Это прекрасно работает, но после нескольких дней работы форма, в которой находится элемент управления ActiveX Flash, выдаст исключение, подобное этому:

System.Runtime.InteropServices.SEHException: External component has thrown an exception.
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.AxHost.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Глядя на менеджера задач, я вижу, что наша программа распределила практически всю доступную память на машине. (~ 500MB)

  • Являются ли компоненты ActiveX (COM) не управляемыми сборщиком мусора?
  • Существует ли какая-либо известная утечка памяти во Flash9.ocx или Flash10.ocx?
  • Есть идеи, как получить внешний компонент (в данном случае Flash ActiveX) для освобождения ресурсов без перезапуска программы? Может ли периодически воссоздавать ShockwaveFlashObject с «новыми» исправлениями?
  • Может быть, перезапуск программы периодически является единственным хорошим вариантом?

Ответы [ 4 ]

2 голосов
/ 21 апреля 2009

Компоненты ActiveX обычно написаны в неуправляемом коде и, следовательно, не будут очищаться сборщиком мусора CLR. Вам необходимо убедиться, что вы освободили все ссылки на элемент управления ActiveX. Я думаю, что это только создаст проблему, если вы много раз воссоздаете элемент управления ActiveX.

Вы можете использовать perfmon для измерения использования памяти CLR и общего использования памяти. Вы можете использовать это, чтобы сузить, кто утечка памяти. (разница будет связана с неуправляемым кодом, таким как элемент управления activex)

Если вы изолируете его от ActiveX или элемента управления флэш-памятью, попробуйте заглушить эти объекты поддельным объектом, который не потребляет память. Это должно позволить вам убедиться, что это источник утечки.

0 голосов
/ 14 марта 2012

Это может быть немного поздно, но это мои 5 центов:

Я думаю, что .swf (флеш-игра, которую вы играете) вызывает утечку памяти, у меня были проблемы с флеш-памятью некоторое время назад, и решение состояло в том, чтобы тщательно просмотреть код и правильно остановить / сбросить все таймеры. уничтожить все использованные объекты и т. д. Я выполнял отладку с помощью processXP, чтобы посмотреть, как флэш-память управляет памятью, и если у вас есть плохая практика кодирования (не удалять EventListener, не останавливать таймеры, создавать новые экземпляры и не использовать их без правильной утилизации) , со временем достигает пределов памяти и вылетает. (сбой происходит независимо от того, где у вас установлена ​​вспышка, в браузере, в автономном режиме, внутри активных элементов и т. д.).

Если вы являетесь создателем .swf, вы могли бы уделить этому больше внимания и вам не пришлось бы перезапускать вашу программу, но если вы получаете ее из других источников, вам придется периодически ее закрывать. потому что вы не знаете, как хорошо закодировано внутри.

0 голосов
/ 21 апреля 2009

Только управляемый код является сборщиком мусора. Код ActiveX использует стандартную коллекцию стилей COM (AddRef / ReleaseRef). Когда вы закончите, используя ссылку на com, установите его в null, чтобы быть безопасным, или оберните с помощью использования ().

0 голосов
/ 21 апреля 2009

Если код в вашем приложении на C # упрощен, я бы рекомендовал просто написать его в AIR. Таким образом, вы не имеете дело с ActiveX и любыми ошибками, которые может иметь Flash OCX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...