Здоровеньки булы, Емельянов Алексей!
18 января 2005 г., вторник, 12:07:52 (GMT+05:00), пришел ко мне
почтальон Почкин и всучил письмо с пометкой "Ошибка при удалении обьекта. Delphi",
в котором сообщалось следующее:
ЕА> Что-то я не помню ни одной операционки которая могла бы сама решить,
ЕА> что процесс больше не будет пользоваться тем или иным ресурсом,
ЕА> если он сам не закрыл все ссылки на него. Освобождаются они
ЕА> лишь при завершении процесса. Так что в этом отношении
ЕА> на Windows незачем грешить.
ЕА> А насчет конкретного случая - есть любимая ошибка использующих
ЕА> CreateProcess - даже если закрывают дескриптор процесса в структуре
ЕА> PROCESS_INFORMATION, забывают закрыть дескриптор потока.
ЕА> В сочетании с возможными утечками ресурсов в запускаемом
ЕА> процессе это при больших нагрузках убьет кого угодно.
ЕА> Возможно, у Вас произошло именно это. Кстати, запускать bat
ЕА> через CreateProcess, мягко говоря, не слишком эффективно.
ЕА> Почему бы не собрать командную строку в памяти
ЕА> и создавать процесс с указанием exe?
function Start(FileName: string; TmpPasToProcessing: string): boolean;
var
si: TStartupInfo;
p: TProcessInformation;
tmp: DWORD;
begin
Result := true;
FillChar(Si, SizeOf(Si), 0);
with Si do
begin
cb := SizeOf( Si);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;
end;
if not Createprocess('d:\p\1.bat', '', nil, nil, true, CREATE_NEW_CONSOLE,
nil, 'D:\p', si, p)
then
begin
ShowMessage(SysErrorMessage(GetLastError));
FormatForm.Terminate := true;
end;
tmp := GetTickCount;
while Waitforsingleobject(p.hProcess, 10) = WAIT_TIMEOUT do
begin
if GetTickCount - Tmp > 500 then
begin
Result := false;
Click;
TerminatePasind;
FormatForm.MemoNotProcessing.Lines.Add(IntToStr(GetTickCount) +':limit
' + FileName);
FormatForm.MemoNotProcessing.Lines.Add(TmpPasToProcessing);
FormatForm.MemoNotProcessing.Lines.SaveToFile('d:\MemoNotProcessing.txt');
TerminateProcess(p.hProcess, 0);
end;
Application.ProcessMessages;
end;
CloseHandle(p.hProcess);
CloseHandle(p.hThread);
end;
Причем условие GetTickCount - Tmp > 500 не выполнялось, однако -
утечка налицо.
AT>> выдает division by zero - ну шо це таке, а?
ЕА> Не очень подробно,
Ну чуть поподробнее:
По MouseWheelDown производилась такая штука:
Scale := Scale - Scale / 10;
glScalef (Scale, Scale, Scale);
Короче изменение масштаба, дык вот это изменение происходило без
ошибок в win2k и выдавала division by zero в XP при переходе через
Scale = 0
ЕА> видимо эта проблема Вас не
ЕА> очень беспокоит или Вы ее решили.
Ну в общем правда :) Я эту прогу просто так сваял чтобы показать
другу что с OpenGL работать умею.
ЕА> арифметики возникают "ошибки ниоткуда".
Кстати да: может это просто это opengl32.dll в XP глючная (для
glScalef). Но это вряд ли.