Как полностью освободить ресурсы после того как COM-объект больше не нужен? В приведенном примере память после завершения работы функции потока не освобождается. Если убрать вызов CoCreateInstance, то все нормально. COM-объект ничего не делает — заготовка сгенерированная CB6. Тестовая программа тоже на CB6.
Здравствуйте, rus blood, Вы писали:
RB>Попытка №1
RB>
RB>CoFreeUnusedLibraries
RB>
Это не помогло. Похоже, что дело именно в вызове CoInitialize, потому что, если функцию потока переписать так, то память растет одни раз при запуске, затем находится на одном уровне и после цикла уменьшается. А если нужно периодически создавать поток?
unsigned __stdcall ThreadFunc(void *apParam)
{
CoInitialize(NULL);
for (int i = 0; i < 100; i++)
{
::CoCreateInstance(CLSID_EmptyCOMClass, NULL, CLSCTX_INPROC_SERVER,
IID_IEmptyCOMClass, (void**)&pObject);
pObject->Release();
cprintf(".");
Sleep(100);
}
CoUninitialize();
}
Здравствуйте, Vorobiev Sergei, Вы писали:
VS>Здравствуйте, rus blood, Вы писали:
а каким образом вы память считаете?
в профайлере или в sysinfo?
RB>>Попытка №1
RB>>
RB>>CoFreeUnusedLibraries
RB>>
VS>Это не помогло. Похоже, что дело именно в вызове CoInitialize, потому что, если функцию потока переписать так, то память растет одни раз при запуске, затем находится на одном уровне и после цикла уменьшается. А если нужно периодически создавать поток?
VS>
Здравствуйте, Vorobiev Sergei, Вы писали:
VS>Привет, Всем!
VS>Как полностью освободить ресурсы после того как COM-объект больше не нужен? В приведенном примере память после завершения работы функции потока не освобождается. Если убрать вызов CoCreateInstance, то все нормально. COM-объект ничего не делает — заготовка сгенерированная CB6. Тестовая программа тоже на CB6.
VS>
День добрый. Я так думаю, что Release метод должен полностью очистить ресурсы, убрать все ссылки на объект и выполнить ему delete. Попробуй использовать CoInitializeEx(NULL, COINIT_MULTITHREADED), это расширенный вариант, специально для мультитредных задач. Должно помочь.
Здравствуйте, jabber, Вы писали:
J>Здравствуйте, Vorobiev Sergei, Вы писали:
VS>>Здравствуйте, rus blood, Вы писали: J>а каким образом вы память считаете? J>в профайлере или в sysinfo?
с помощью утилиты Process Explorer (www.sysinternals.com) также как и в Task Manager только удобнее
Здравствуйте, VictorProg, Вы писали:
VP>Здравствуйте, Vorobiev Sergei, Вы писали:
VS>>Привет, Всем!
VS>>Как полностью освободить ресурсы после того как COM-объект больше не нужен? В приведенном примере память после завершения работы функции потока не освобождается. Если убрать вызов CoCreateInstance, то все нормально. COM-объект ничего не делает — заготовка сгенерированная CB6. Тестовая программа тоже на CB6.
VP>День добрый. Я так думаю, что Release метод должен полностью очистить ресурсы, убрать все ссылки на объект и выполнить ему delete. Попробуй использовать CoInitializeEx(NULL, COINIT_MULTITHREADED), это расширенный вариант, специально для мультитредных задач. Должно помочь.
Пробовал уже не помогает. Я думаю, что дело в повторных вызовах CoInitialize. Как я писал ниже, если я делаю одни вызов CoInitialize, а в цикле создаю и удаляю объект то память растет один раз. Если написать что-то наподобие этого
for (int i = 0; i < 100; i++)
{
CoInitialize(NULL);
CoUninitialize();
}
Здравствуйте, Vorobiev Sergei, Вы писали:
VS>Здравствуйте, VictorProg, Вы писали:
VP>>Здравствуйте, Vorobiev Sergei, Вы писали:
VS>>>Привет, Всем!
VS>>>Как полностью освободить ресурсы после того как COM-объект больше не нужен? В приведенном примере память после завершения работы функции потока не освобождается. Если убрать вызов CoCreateInstance, то все нормально. COM-объект ничего не делает — заготовка сгенерированная CB6. Тестовая программа тоже на CB6.
VP>>День добрый. Я так думаю, что Release метод должен полностью очистить ресурсы, убрать все ссылки на объект и выполнить ему delete. Попробуй использовать CoInitializeEx(NULL, COINIT_MULTITHREADED), это расширенный вариант, специально для мультитредных задач. Должно помочь.
VS>Пробовал уже не помогает. Я думаю, что дело в повторных вызовах CoInitialize. Как я писал ниже, если я делаю одни вызов CoInitialize, а в цикле создаю и удаляю объект то память растет один раз. Если написать что-то наподобие этого
VS>
VS> for (int i = 0; i < 100; i++)
VS> {
VS> CoInitialize(NULL);
VS> CoUninitialize();
VS> }
VS>
VS>то память не растет.
Странно, у меня используется CoInitializeEx(NULL, COINIT_MULTITHREADED) и всё работает нормально. Попробуй поменять флаги.
Здравствуйте, VictorProg, Вы писали:
VP>Здравствуйте, Vorobiev Sergei, Вы писали:
VS>>Здравствуйте, VictorProg, Вы писали:
VP>>>Здравствуйте, Vorobiev Sergei, Вы писали:
VS>>>>Привет, Всем!
VS>>>>Как полностью освободить ресурсы после того как COM-объект больше не нужен? В приведенном примере память после завершения работы функции потока не освобождается. Если убрать вызов CoCreateInstance, то все нормально. COM-объект ничего не делает — заготовка сгенерированная CB6. Тестовая программа тоже на CB6.
VP>>>День добрый. Я так думаю, что Release метод должен полностью очистить ресурсы, убрать все ссылки на объект и выполнить ему delete. Попробуй использовать CoInitializeEx(NULL, COINIT_MULTITHREADED), это расширенный вариант, специально для мультитредных задач. Должно помочь.
VS>>Пробовал уже не помогает. Я думаю, что дело в повторных вызовах CoInitialize. Как я писал ниже, если я делаю одни вызов CoInitialize, а в цикле создаю и удаляю объект то память растет один раз. Если написать что-то наподобие этого
VS>>
VS>> for (int i = 0; i < 100; i++)
VS>> {
VS>> CoInitialize(NULL);
VS>> CoUninitialize();
VS>> }
VS>>
VS>>то память не растет.
VP>Странно, у меня используется CoInitializeEx(NULL, COINIT_MULTITHREADED) и всё работает нормально. Попробуй поменять флаги.
Что вы имеете ввиду под нормально? У меня тоже все работает и раньше работало — растет память. Здесь дело не в потоке. Тоже самое будет если поток не создавать.
Можно конечно создавать поток один раз и останавливать его когда это нужно, например,
while(1)
{
WaitForSingleObject(hEvent, INFINITE);
// Делаем то что на надо
}
Но я думаю, что если поток создается редко, то его лучше удалить — зачем ему в памяти висеть... а получается что так только памяти больше отжирается
Здравствуйте, Vorobiev Sergei, Вы писали:
VS>Как полностью освободить ресурсы после того как COM-объект больше не нужен? В приведенном примере память после завершения работы функции потока не освобождается. Если убрать вызов CoCreateInstance, то все нормально. COM-объект ничего не делает — заготовка сгенерированная CB6. Тестовая программа тоже на CB6.
CB6 — это билдер? Под студией практически с таким же кодом (создаваемый объект другой) проблем не возникает.
В коде странноватым местом является глобальный pObject. Я бы попробовал его убрать в функцию потока.
Здравствуйте, George Seryakov, Вы писали:
GS>Здравствуйте, Vorobiev Sergei, Вы писали:
VS>>Как полностью освободить ресурсы после того как COM-объект больше не нужен? В приведенном примере память после завершения работы функции потока не освобождается. Если убрать вызов CoCreateInstance, то все нормально. COM-объект ничего не делает — заготовка сгенерированная CB6. Тестовая программа тоже на CB6.
GS> CB6 — это билдер? Под студией практически с таким же кодом (создаваемый объект другой) проблем не возникает.
Да. Под студией создал точно такой же пример и действительно все нормально. Странно, возможно под билдером в коде, который создает визард что-то не так.
GS> В коде странноватым местом является глобальный pObject. Я бы попробовал его убрать в функцию потока.