Статическое использование в DirectShow Filters - PullRequest
0 голосов
/ 16 ноября 2011

Когда мы создаем фильтр DirectShow и регистрируем его, статические переменные / функции совместно используются в нескольких экземплярах одного и того же фильтра.Я считаю, что это относится и к другим элементам управления ActiveX.Например, если я пытаюсь использовать что-то вроде:

static int counter = 0;

void someFunction() {
    counter++;
    // trace result here
}

Если я запускаю другой экземпляр того же фильтра, второй экземпляр начинается не с 0, а там, где остался первый счетчик экземпляров.И затем они начинают асинхронно увеличивать один и тот же счетчик.

Мой вопрос: есть ли какой-нибудь разумный способ заблокировать совместное использование статических переменных для фильтров DirectShow?Это может показаться глупым, но если мы зарегистрируем один и тот же фильтр с другим GUID (путем перекомпиляции одного и того же проекта с другим GUID и выходным файлом), статические переменные больше не будут использоваться совместно, потому что это два разных фильтра, верно?Итак, есть ли способ, которым я могу смоделировать это, используя тот же фильтр, но сохраняя статику?

Что я пытаюсь сделать, это использовать библиотеку со многими статическими использованиями в ней.Избавиться от всех статических переменных / функций очень сложно.библиотека, которую я пытаюсь использовать, использует старые стандарты, такие как Ansi C, и не имеет реального объектно-ориентированного дизайна.Итак, инкапсуляция не очень проста.Большинство функций находятся в глобальном пространстве, а не в классах.Пожалуйста, имейте это в виду.Если я оставлю статику такой, какая есть, один экземпляр фильтра будет работать нормально, но другие экземпляры начнут портиться из-за общих (статических) переменных.

1 Ответ

0 голосов
/ 16 ноября 2011

Это на самом деле не специфично для DirectShow, вопрос типичный: стоит ли использовать статические переменные в нескольких экземплярах моего класса.

Умный ответ: если вы не хотите использовать статические переменные -нет.Каждый экземпляр вашего фильтра является отдельным экземпляром класса.Используйте его переменные-члены и не используйте глобальные переменные.

Что я пытаюсь сделать, так это использовать библиотеку со многими статическими элементами.Избавиться от всех статических переменных / функций очень сложно.

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

Другое решение - переместить всю статику в дочернюю DLL и загрузить ее вне процесса, чтобы каждый экземпляр размещался в отдельном процессе.Хотя технически это решает вашу проблему напрямую - то есть, в дочернем процессе все статические данные остаются статичными, и в то же время каждый фильтр владельца владеет отдельной копией, знания, необходимые для реализации внепроцессной DLL и межпроцессного взаимодействия, в основном предполагают, что выудалось успешно реализовать первое «государственное» решение, упомянутое в предыдущем абзаце.

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