topsel
Зарегистрирован: 29.01.2005 Сообщения: 10 Откуда: vladivostok
|
Добавлено: Вт Май 17 2005 06:47 Заголовок сообщения: Отладка приложения |
|
|
Люди помогите.
Поток постепенно съедает память. Думаю что в этом виноват инкремент счетчика, но имеется процедура сброса счетчика на 0. много памяти брать не должен ( чилло сброса не больше 10ти).
вот код может кто поковыряет....
Код: | procedure Tmainproc.Execute; // основная процедура
var
count:integer;
time:integer;
hPrinter: THandle;
bResult: Boolean;
cbBuf: DWORD;
pcbNeeded: DWORD;
pcReturned: DWORD;
aJobs: array[0..99] of JOB_INFO_1;
aInfo: pPRINTERINFO2;
_cb:integer;
begin
//устанавливаем счетчик в 0
count1:=0;
while true do // запускаем код в циклическое исполнение
begin //open 1
sleep(100); // задается период повторения цикла
if count1>(del-1) then //сброс счетчика
count1:=0;
prnt:=printername[count1];
{выделение памяти под буфер и получение данных о заданиях печати}
cbBuf := 1000;
bResult := OpenPrinter(PChar(prnt), hPrinter, nil);
bResult := EnumJobs(hPrinter, 0, Length(aJobs), 1, @aJobs, cbBuf, pcbNeeded, pcReturned);
data0[count1]:='';
{составление строки сообщения клиента}
if aJobs[0].pDocument<>nil then
begin //open2
count0[count1]:=count0[count1]+1;
user:=aJobs[0].pUserName;
if aJobs[0].TotalPages>aJobs[0].PagesPrinted then
totalpages:=inttostr(aJobs[0].TotalPages)
else
totalpages:=inttostr(aJobs[0].PagesPrinted);
if totalpages='0' then totalpages:='1';
tasktime:=datetimetostr(SystemTimeToDate(aJobs[0].Submitted));
data0[count1]:='-'+machine+'+'+prnt+'+'+user+'+'+totalpages+'+'+tasktime+'@';
if (data1[count1]='') and (data0[count1]<>'')then
data1[count1]:= data0[count1];
{действие при превышении интервала печати}
if Count0[count1]>600 then // задаем время наличия задания в очереди печати
begin //open3 // если оно находится более 5 минут то считается что
cbBuf:=10000; //есть ошибка
count0[count1]:=0;
data:='-'+machine+'+'+prnt+'+ERROR+'+totalpages+'+'+tasktime+'@';
OpenPrinter(PChar(prnt), hPrinter, nil);
for count:=0 to 50 do
begin //open4
SetJob(hPrinter,aJobs[count].JobId ,0, 0,JOB_CONTROL_CANCEL);
end; //close4
ClosePrinter(hPrinter);
end; //close3
end; //close2
{проверка окончания печати задания}
if (aJobs[0].pDocument=nil) and (data1[count1]<>'') then
begin //open5
data:=data1[count1];
data1[count1]:='';
Synchronize(ClientActiv);
end; //close5
count1:=count1+0;
end; //close1
end; //close0 |
Спасибо всем кто смотрел... |
|
topsel
Зарегистрирован: 29.01.2005 Сообщения: 10 Откуда: vladivostok
|
Добавлено: Ср Май 18 2005 06:34 Заголовок сообщения: |
|
|
переправил код, убрал все циклы кроме основного и
оставил, а оно всеравно современем жрет, может это свойство tthread-а такое и его терминейтить надо????
как вообще память очищать??? |
|