![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с теорией, как организовать работу объекта. [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мс. Ну и пусть себе висят "вчерашние" данные, кому они мешают?