Vista: WPF приложение + native ActiveX

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 10 сен 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Имеется WPF приложение, внутри которого бегают нативные ActiveX-контролы.

    Под XP - все хорошо.

    Под вистой возникла проблема. Создаю пару потоков, потом их прибиваю, потом пытаюсь создать снова - CreateThread возвращает ERROR_NOT_ENOUGH_MEMORY. Погуглил. Гугл предложил уменьшить Stack size. Уменьшил до 4-х килобайт - результат тот же :dntknw:

    Vista 32бита, бежит под вмварой, 1 гиг памяти. Однако вмвара точно не при чем - у кастомера на живой все тоже самое.

    Мысли? Идеи? Троллинг?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не знаю, важно это или нет: Security attributes = 0, Flags = CREATE_SUSPENDED.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Еще более точно:

    У контрола есть некий метод, который дергается из WPF-ной апликухи. Дергается два раза. Первый раз - создаются два потока. Второй раз - потоки корректно завершуются (джойняца) и пытаются создаться заново, где собсна и происходит fail. Примерно так:

    1. WPF working...
    2. ActiveX.Foo()
    CreateThread(CREATE_SUSPENDED);
    ResumeThread();
    CreateThread(CREATE_SUSPENDED);
    ResumeThread();
    3. WPF working...
    4. ActiveX.Foo()
    WaitForSingleObject();
    CloseHandle();
    WaitForSingleObject();
    CloseHandle();
    CreateThread(CREATE_SUSPENDED); // Epic Fail !
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    И еще один забавный момент - если ActiveX в дебажной сборке, то все работает :)
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    И еще :)

    Если во время первого Foo создать пиисят потоков и запустить чтобы они вечно бегали, то все они создадутся и все будет ок. Если создать два - удалить два - создать два - удалить два - ... То все тоже будет ок. Ломается все именно во втором вызове Foo. Из чего можно на 80% сделать вывод, что неведомая гусиная х#йня происходит внутри WPF между вызовами функций контрола...
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    ОМГ, разобрался))) WPF тут видимо не при чем :)

    Ситуация была такова: В некоторый момент происходило следующее:

    В потоке "A":
    WaitForSingleObject(Поток "X");
    CloseHandle(Поток "X");

    В потоке "B":
    WaitForSingleObject(Поток "Х");

    При этом судя по всему сначала отрабатывал поток "A", дожидался завершения потока "X" и закрывал его хендл. После этого управление передавалось потоку "B", который оказывался в состоянии ожидания завершения уже закрытого потока. Походу от этого висте сносило башню и она больше не могда создавать новые потоки. Интерено сравнить поведение Vista с XP - кто из них ведет себя правильно.

    Всем, кто эти два с половиной часа мыслями был со мной, спасибо за моральную поддержку :-D
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _DEN_
    Не вижу ничего нативного.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Clerk

    Нативный - значит unmanaged компилируемый код. Это MFC ActiveX Control.