Грязные окна

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Грязные окна

Сообщение Игорь Столяров »

Привет всем !

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

Это у меня какие-то проблемы с чисткой памяти или вообще так и должно быть ? И можно ли как-нибудь это безобразие прекратить ?
Среда WinXP SP2 & C63 9053. Заранее спасибо за совет ...
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

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

Сообщение 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
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

В Clarion5.5 замечал подобное, при продолжительной работе проги (насколько это было возможно в 5.5 :)), память постепенно жралась, думал это из-за глючности менеждера памяти, теперь возможно дело действительно в ABC.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сообщение Игорь Столяров »

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

Тогда вопрос можно поставить по другому: есть ли средства и возможность вернуть память выделенную потоку с ABC, после его закрытия ?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

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

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

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

ЗЫ
хорошо, что я так и не преполз на ABC.
Вооще то и от Legay юзается только Window и Source процедуры, остальное своё - родное ;)
Аватара пользователя
NickTsigouro
Новичок
Сообщения: 5
Зарегистрирован: 16 Июнь 2006, 13:00
Откуда: Москва
Контактная информация:

Сообщение NickTsigouro »

А может это проблема "грязного" закрытия файлов?
WBR, Nick Tsigouro
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

легко проверить - поиграться с окном, где нет никаких файлов
С уважением, ДП
Аватара пользователя
Олег
Ветеран движения
Сообщения: 122
Зарегистрирован: 16 Июль 2005, 2:35
Откуда: Москва
Контактная информация:

Сообщение Олег »

Буквально сейчас случайно наткнулся на:
Обновление - 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
Может из-за этого?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сообщение Игорь Столяров »

Спасибо - к сожалению, не помогло. Я тоже склоняюсь к мысли, что ответ зарыт где-то в глубинах класов ABC - но моих знаний явно недостаточно, что бы его откопать. Да и смысл ?
Видимо придется запомнить еще одну "особенность" Clarion и просто обойти ее. Например для задач переодического опроса - не открывать окна в потоке ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Олег
Ветеран движения
Сообщения: 122
Зарегистрирован: 16 Июль 2005, 2:35
Откуда: Москва
Контактная информация:

Сообщение Олег »

Ну, почему-же - сразу "не открывать окна"!?
Просто используй для таких процедур обычный шаблон "Исходный текст", или как он там, в ABC, называется. Т.е., рисуй "ручное" окно а для его обработки используй стандартный ACCEPT-цикл с нужными событиями. А еще лучше - адаптируй шаблон "Window" из Legacy-набора к ABC-шаблонам. Главная идея - обработка окна ТОЛЬКО стандартными операторами языка БЕЗ использования ABC-классов.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7374
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сообщение Игорь Столяров »

К своему великому сожалению, господа - должен признать - что та же самая процедура переписанная без ABC работает без потерь памяти.
Окна открываются и закрываются нормально. Спасибо всем ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
NickTsigouro
Новичок
Сообщения: 5
Зарегистрирован: 16 Июнь 2006, 13:00
Откуда: Москва
Контактная информация:

Сообщение 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
WBR, Nick Tsigouro
Ответить