Страница 1 из 1

Грязные окна

Добавлено: 14 Июнь 2006, 15:45
Игорь Столяров
Привет всем !

А не обращал ли кто внимание на такой интересный эффект:
Есть AppFrame - меню, в нем по таймеру (или вручную - все равно),
абсолютно штатными средствами открывается и закрывается
MDI (или SDI) окно как поток: Start(MyWindow). Так вот - если посмотреть в диспечере задач - то такое "приложение" будет медленно, но уверенно "подъедать" память с каждым циклом открытия/закрытия окна.
Если окошко открывается / закрывается по таймеру, например раз в 30 сек. - то за сутки будет съедено несколько Mbyte.

Это у меня какие-то проблемы с чисткой памяти или вообще так и должно быть ? И можно ли как-нибудь это безобразие прекратить ?
Среда WinXP SP2 & C63 9053. Заранее спасибо за совет ...

Re: Грязные окна

Добавлено: 16 Июнь 2006, 11:08
Andrew™
Игорь Столяров писал(а): Это у меня какие-то проблемы с чисткой памяти или вообще так и должно быть ? И можно ли как-нибудь это безобразие прекратить ?
Среда WinXP SP2 & C63 9053. Заранее спасибо за совет ...
состряпал пример, и не увидел того, что память постоянно отжирается, вероятно, если это ABC, проблема в ABC классах

Код: Выделить всё

    program
    map
     main
     wProc
    end
ThreadWPRoc LONG
    code
    main

main    procedure
AppFrame APPLICATION('Application'),AT(,,493,293),FONT('MS Sans Serif',8,,FONT:regular),CENTER,IMM,ICON(icon:exclamation), |
         SYSTEM,MAX,RESIZE,TIMER(30)
     END
    CODE
    OPEN(AppFrame)
    ACCEPT
     CASE EVENT()
      OF EVENT:Timer
       IF NOT ThreadwPRoc
        START(wProc,25000)
       END
     END
    END

wProc       PROCEDURE
Window WINDOW('Caption'),AT(,,287,162),FONT('MS Sans Serif',8,,FONT:regular),CENTER,IMM,TIMER(30),SYSTEM, |
         GRAY,MDI
     END
    code
 ThreadWPRoc = THREAD()
 open(window)
    ACCEPT
     CASE EVENT()
      OF EVENT:Timer
       BREAK
     END
    END
 close(window)
 ThreadWPRoc = 0

Добавлено: 16 Июнь 2006, 11:16
ru_alex
В Clarion5.5 замечал подобное, при продолжительной работе проги (насколько это было возможно в 5.5 :)), память постепенно жралась, думал это из-за глючности менеждера памяти, теперь возможно дело действительно в ABC.

Добавлено: 16 Июнь 2006, 13:30
Игорь Столяров
Да действительно - я это заметил на программе с ABC. Причем, есть еще одна интересность - если окно в потоке не открывать, то нарастание памяти не происходит. При этом классы ABC используются - для доступа к файлам и т.д.

Тогда вопрос можно поставить по другому: есть ли средства и возможность вернуть память выделенную потоку с ABC, после его закрытия ?

Добавлено: 16 Июнь 2006, 13:35
Andrew™
Игорь Столяров писал(а):Да действительно - я это заметил на программе с ABC. Причем, есть еще одна интересность - если окно в потоке не открывать, то нарастание памяти не происходит. При этом классы ABC используются - для доступа к файлам и т.д.

Тогда вопрос можно поставить по другому: есть ли средства и возможность вернуть память выделенную потоку с ABC, после его закрытия ?
надо шерстить ABC классы, где то, что то не подчищают за собой, особенно работу ANY полей в GROUP и QUEUE, если таковые имеются

просто снаружи что то сделать, например побегать с бубном, не получится

ЗЫ
хорошо, что я так и не преполз на ABC.
Вооще то и от Legay юзается только Window и Source процедуры, остальное своё - родное ;)

Добавлено: 16 Июнь 2006, 15:01
NickTsigouro
А может это проблема "грязного" закрытия файлов?

Добавлено: 16 Июнь 2006, 16:31
Дед Пахом
легко проверить - поиграться с окном, где нет никаких файлов

Добавлено: 16 Июнь 2006, 23:58
Олег
Буквально сейчас случайно наткнулся на:
Обновление - KB319740

Обновление для Windows XP, которое исправляет ошибку утечки памяти в Graphics Device Interface (GDI) при создании/удалении дочернего окна. После установки этого обновления - потребуется перезагрузка компьютера.

_http://download.microsoft.com/download/6/6/9/6697a1d9-4734-4829-80b9-de3d74fb6049/WindowsXP-KB319740-v5-x86-RUS.exe
Может из-за этого?

Добавлено: 17 Июнь 2006, 8:59
Игорь Столяров
Спасибо - к сожалению, не помогло. Я тоже склоняюсь к мысли, что ответ зарыт где-то в глубинах класов ABC - но моих знаний явно недостаточно, что бы его откопать. Да и смысл ?
Видимо придется запомнить еще одну "особенность" Clarion и просто обойти ее. Например для задач переодического опроса - не открывать окна в потоке ...

Добавлено: 17 Июнь 2006, 18:40
Олег
Ну, почему-же - сразу "не открывать окна"!?
Просто используй для таких процедур обычный шаблон "Исходный текст", или как он там, в ABC, называется. Т.е., рисуй "ручное" окно а для его обработки используй стандартный ACCEPT-цикл с нужными событиями. А еще лучше - адаптируй шаблон "Window" из Legacy-набора к ABC-шаблонам. Главная идея - обработка окна ТОЛЬКО стандартными операторами языка БЕЗ использования ABC-классов.

Добавлено: 18 Июнь 2006, 8:11
Игорь Столяров
К своему великому сожалению, господа - должен признать - что та же самая процедура переписанная без ABC работает без потерь памяти.
Окна открываются и закрываются нормально. Спасибо всем ... :(

Добавлено: 04 Июль 2006, 16:16
NickTsigouro
А у меня на ABC-шном фрейме все равно течет:

Код: Выделить всё

LegSpalsh            PROCEDURE                             ! Declare Procedure
Thr     Long
Window WINDOW('Caption'),AT(,,145,67),FONT('MS Sans Serif',8,,FONT:regular),TIMER(50),SYSTEM,GRAY,RESIZE, |
         MDI
       STRING(@s20),AT(28,29),USE(Thr)
     END
  CODE
  Thr = Thread()
  Open(Window)
  Accept
    Case Event()
    Of Event:Timer
      Break
! или Post(Event:CloseWindow), без разницы
    end
  end