Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Вниз

Увеличивается размер занимаемой памяти   Найти похожие ветки 

 
Dmitry   (2003-11-06 06:42) [0]

У меня такая проблема: программа, которую я написал представляет собой нечто вроде слайд-шоу, подгружает разные картинки, видеоролики, флэш-ролики, и показывает их один за другим. Все они лежат в определенной папке для того, чтоб из можно было в любой момент заменить. Но программа, постепенно увеличивает занимаемый ею размер памяти. В результате ошибка-"Свободная виртуальная память заканчивается и т.д.". Пока не перезапустишь программу.
Что сделать? Может можно как-то высвобождать память?


 
Юрий Зотов   (2003-11-06 07:05) [1]

Если Вы ее динамически выделяете, то нужно освобождать, а если нет - то не нужно. Стандартный ответ.

Возможно, в программе использованы криво написанные компоненты, из-за которых действительно утекает память.


 
Dmitry   (2003-11-06 07:16) [2]

Нет, я ее нигде не выделяю.
Правда использую TActiveMovie, TShockWareFlash - ActiveX компоненты.
Для вывода картинок - LoadFromFile.


 
Думкин   (2003-11-06 07:27) [3]


> [2] Dmitry (06.11.03 07:16)
> Нет, я ее нигде не выделяю.
> Правда использую TActiveMovie, TShockWareFlash - ActiveX
> компоненты.
> Для вывода картинок - LoadFromFile.

Здесь подробнее. Какова дальнейшая судьба того что ты "вывел"?


 
Юрий Зотов   (2003-11-06 07:45) [4]

Если TActiveMovie, TShockWareFlash и пр. написаны грамотно, то перед каждым новым LoadFromFile они должны сами освобождать ранее выделенный буфер. Я почти не сомневаюсь, что они это и делают, но для проверки можно перед LoadFromFile вызывать что-то типа Clear (или Unload, или еще что-то в этом духе - ну должен же быть у них какой-то метод освобождения памяти).


 
Dmitry   (2003-11-06 07:56) [5]

Весь код приводить не буду, полно всяких таймеров и т.д., но в общем идея такая:

1. ActiveMovie1.FileName:="1.mpg";
2. ActiveMovie1.Visible:=True;
3. таймер;
4. ActiveMovie1.Visible:=False;

5. ShockWareFlash1.Movie:="1.swf";
6. ShockWareFlash1.Visible:=True;
7. таймер;
8. ShockWareFlash1.Visible:=False;

9. Image1.Visible:=True;
10. Image1.Picture.LoadFromFile(ImageFile);
11. таймер;
12. Image1.Visible:=False;

И все это вертится до бесконечности, толко меняются названия видеороликов, флэшроликов, картинок.

И постепенно увеличивается размер занимаемой памяти, пока не сожрет всю память. Ну а потом пипец - встали :)


 
Юрий Зотов   (2003-11-06 08:20) [6]

Сразу после Visible := False вызывайте очистку буфера (если, конечно, не собираетесь показывать один и тот же ролик повторно).


 
Dmitry   (2003-11-06 08:38) [7]

Вот знать бы как ее вызвать.
Единственный вариант какой я придумал - это ActiveMovie1.FileName="несуществующий путь", но это проблемы не решает.
А насчет Clear или UpLoad - таких, и им подобных методов нет.


 
Юрий Зотов   (2003-11-06 08:58) [8]

> ActiveMovie1.FileName="несуществующий путь"

Может ни к чему не привести или даже привести к ошибке. Потому что компонент проверит путь и либо проигнорирует его, либо сгенерит exception.

> А насчет Clear или UpLoad - таких, и им подобных методов нет.

Не верится. Должно быть. Любой писатель компонентов, если только он не полный чайник, просто обязан был их предусмотреть.


 
Dmitry   (2003-11-06 10:05) [9]

Кто-нибудь работал с ActiveMovie и сталкивался с такой проблемой?


 
Dmitry   (2003-11-09 05:13) [10]

опять тотже вопрос =-))


 
Dmitry   (2003-11-09 12:13) [11]

Мужики ну елки-палки =-)))
Может есть идей как вобще ограничить размер памяти выделяемый под приложение.
Вдруг сработает.
не проблема решается тем, чтобы написать такую штуку:
Это приложение раз в сутки к примеру запускает другое, а себя закрывает, а то в свою очередь сразу же открывает опять первое.
Как сервис допустим реализовать.

Но ни бред ли это?


 
Dmitry   (2003-11-11 03:53) [12]

нда...


 
Suntechnic   (2003-11-11 06:06) [13]

>Dmitry ©
Ты б для начала локализовал проблему, а затем вопрошал бы. Ну чего нам здесь гадать TActiveMovie это или TShockWareFlash? А отключить их по очереди и погонять приложение тебе в голову не приходило? Того глядишь какя-нибудь конкретная картинка и нарисовалась бы.


 
Dmitry   (2003-11-11 06:21) [14]


> Suntechnic © (11.11.03 06:06) [13]

обратите пожалуйста внимание на все что на писано до
> Dmitry (06.11.03 10:05) [9]

и особенно на
> Dmitry (06.11.03 10:05) [9]

Еще сильнее локализировать я не могу.
Проблема именно в нем?
вот я и задаю вопрос: Кто-нибудь сталкивался с такой проблемой, а кроме теоретических предложений я получить не могу, я конечно понимаю, что здесь мне никто ничего не должен, но я и сам знаю что там должен быть метод очистки, но его нет, вот я и прошу реальной помощи, а не теории.
Или же ответа, что извини мы не знаем как с этой штукой работать в Delphi, обратись к более знающим где-нибудь в другом месте.


 
Zergling   (2003-11-11 06:33) [15]

Dmitry

А может код пополнее привести. Вдруг всетаки проблема там.


 
Suntechnic   (2003-11-11 06:41) [16]

To: Dmitry ©
обратите пожалуйста внимание на все что на писано до
> Dmitry (06.11.03 10:05) [9]
и особенно на
> Dmitry (06.11.03 10:05) [9]


И на что ж мне там обращать внимание? Я конечно не хочу разводить здесь флейм, но ткните меня мышкой туда, где написано, что Вы пробовали отключить TShockWareFlash и проблема оказалась именно в TActiveMovie? Если Вы как раз это и подразумевали под постом [9], тогда надо чётче выражать свои мысли.


 
Dmitry   (2003-11-11 06:54) [17]


unit Unit1;

interface

uses
Windows, SysUtils, Graphics, Forms, ExtCtrls, Classes,
StdCtrls, Controls, dialogs, jpeg, OleCtrls, AMovie_TLB,
ShockwaveFlashObjects_TLB;

type
TForm1 = class(TForm)
TimerSlideShow: TTimer;
TimerVideo: TTimer;
SlideShowImage: TImage;
EuropeMovie: TActiveMovie;
EuropeBigFlash: TShockwaveFlash;
TimerEuropeBigFlash: TTimer;
procedure FormCreate(Sender: TObject);
procedure TimerVideoTimer(Sender: TObject);
procedure Begining;
procedure TimerSlideShowTimer(Sender: TObject);
procedure TimerEuropeBigFlashTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Increment:integer=0;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
EuropeMovie.Align:=alClient;
EuropeMovie.Top:=0;
EuropeMovie.Left:=0;
EuropeMovie.FileName:="D:\ResurceSlideShow\Videos\1.mpg";
Begining;
end;

//*****Флэшролик*****

procedure TForm1.Begining;
begin
EuropeBigFlash.Movie:="D:\";
EuropeBigFlash.Movie:="D:\ResurceSlideShow\Flash\1.swf";
EuropeBigFlash.Left:=0;
EuropeBigFlash.Top:=0;
EuropeBigFlash.Height:=768;
EuropeBigFlash.Width:=1024;
EuropeBigFlash.Visible:=True;
TimerEuropeBigFlash.Enabled:=True;
end;

//*****Флэшролик пошел*****

procedure TForm1.TimerEuropeBigFlashTimer(Sender: TObject);
begin
TimerEuropeBigFlash.Enabled:=False;
EuropeBigFlash.Visible:=False;
EuropeMovie.ShowControls:=False;
EuropeMovie.ShowTracker:=False;
EuropeMovie.ShowDisplay:=False;
EuropeMovie.Visible:=True;
EuropeMovie.Run;
TimerVideo.Enabled:=True;
end;

//*****Видеоролик пошел*****

procedure TForm1.TimerVideoTimer(Sender: TObject);
begin
EuropeMovie.Visible:=False;
TimerVideo.Enabled:=False;
TimerSlideShow.Enabled:=True;
end;

//*****Картинки пошли*****

procedure TForm1.TimerSlideShowTimer(Sender: TObject);
var ImageFile:String;
begin
Inc(Increment);
ImageFile:="d:\ResurceSlideShow\Images\"+IntToStr(Increment)+".jpg";
if FileExists(ImageFile) then
begin
SlideShowImage.Picture.LoadFromFile(ImageFile);
end
else
begin
TimerSlideShow.Enabled:=False;
SlideShowImage.Picture.Assign(nil);
Increment:=0;
Begining;
end;
end;

end.


Картинки лежат в папке, и инменуются строго так: 1.jpg, 2.jpg, 3.jpg, и т.д.


 
Dmitry   (2003-11-11 06:55) [18]


> Suntechnic © (11.11.03 06:41) [16]

Извиняюсь за нечетко выраженные мысли, я имел ввиду это.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.009 c
11-65810
vgb
2003-03-03 22:31
2003.11.20
Окно нестандартной формы


6-66050
Виноградов Алексей
2003-09-25 20:54
2003.11.20
Как узнать, от какого клиента пришли данные в TServerSocket ? (+)


1-65817
Ломброзо
2003-11-10 11:02
2003.11.20
VB ActiveX


14-66111
Ёжик
2003-10-28 12:58
2003.11.20
Вопрос на засыпку...


1-65969
Slavik
2003-11-11 03:07
2003.11.20
Куда подевался компонент TQuickReport в D7?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский