Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с теорией, как организовать работу объекта. [D7, WinXP]


Aleksandr. ©   (2004-10-04 14:33:00) 

Сейчас у меня есть объект-потомок TObjectList. Его задача - хранить в себе уникальные имена файлов, сгенерированные за последние 2 минуты.

 TATIFileItem = class
   FileName : string;
   FileTime : TDateTime;
   constructor Create(AName : string);
 end;

 TATIFileItemList = class (TObjectList)
 private
   function Get(Index: integer): TATIFileItem;
   procedure Put(Index: integer; const Value: TATIFileItem);
   procedure DoCheckTimes;
 public
   function Add(Item : TATIFileItem) : integer;
   function IndexOf(AName : string) : integer;
   property Items[Index : integer] : TATIFileItem read Get write Put;
 end;

function TATIFileItemList.Add(Item: TATIFileItem): integer;
begin
 EnterCriticalSection(GFCS);
 try
   DoCheckTimes;
   Result:=Inherited Add(Item)
 finally
   LeaveCriticalSection(GFCS)
 end
end;

procedure TATIFileItemList.DoCheckTimes;
var
 i : integer;
begin
 i:=0;
 while i


Defunct   (2004-10-04 18:03:00) [1]

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

Почему нельзя воспользоваться обычным таймером?


Erik1   (2004-10-04 15:55:00) [2]

А ты перепиши все, да с соблюбением рекомендаций по написанию тредов и использованием TMultiReadExclusiveWriteSynchronizer. Глядиш все и заработает.


Aleksandr.   (2004-10-04 15:13:00) [3]

Erik1 ©  :
>> У тебя наверника стек переполняется.
Да, разумеется, раз Дебаг ЦПУ вылетает. Только не силен я понять технологию, по которой он переполняется.


Erik1   (2004-10-04 14:54:00) [4]

Ну и запускатся стоит с интервалом в 2 минуты = 2*60*1000 mc
Также в execute непрлохо поставить функцию ожидания WaitForMultiObject(...,2*60*1000) и предусмотреть event для выхода из программы. У тебя наверника стек переполняется.


Erik1   (2004-10-04 14:49:00) [5]

Я за тебя твой код отлаживать небуду, но коекакие рекомендации дам. Твой класс TATIFileItem излишен замени его на
RATIFileItem = record
 FileName : ShortString;
 FileTime : TDateTime;
end;
и создовай с помощю New уничтожай Dispose. Тогда можно будет использовать TThreadSafeList
TThreadSafeList = class
 private
   FLock: TMultiReadExclusiveWriteSynchronizer;
   FItems: TList;
   function GetCount: Integer;
   function GetItem(Index: Integer): Pointer;
 public
   constructor Create;
   destructor Destroy; override;
   procedure BeginRead;
   procedure EndRead;
   procedure BeginWrite;
   procedure EndWrite;
   function IndexOf(Item: Pointer): Integer;
   function Add(Item: Pointer): Integer;
   procedure Clear;
   property Count: Integer read GetCount;
   property Items[Index: Integer]: Pointer read GetItem; default;
 end;
...........
function TThreadSafeList.GetCount: Integer;
begin
 BeginRead;
 try
   Result := FItems.Count;
 finally
   EndRead;
 end;
end;

Или чтото вроде этого.


Aleksandr.   (2004-10-04 14:47:00) [6]

Sandman25 ©  :
Мне. На сервере с программой побывал один из тех бездельников, что именуются бессмысленным словом "сисадмин", и после него с программой начались чудеса - как и прежде, оперативку она освобождает после окончания работы с объектами (данные с Process Explorer - Virtual Size я называю виртуальной памятью, а Working Set - оперативкой), а вот виртуальная память у нее копится, и в районе Virtual Size=240 метров и Working Set=12 метров (второе сколько и при запуске) она со ссылкой на нехватку памяти для запуска новых потоков перестает работать, причем случается это сразу утром.


Sandman25   (2004-10-04 14:38:00) [7]

ИМХО неправильно проверять в цикле, тем более каждые 10мс. Ну и пусть себе висят "вчерашние" данные, кому они мешают?


Наверх

Титульная страница Поиск, карта сайта Написать письмо