Форум: "Основная";
Текущий архив: 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