Форум: "Система";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизЧто такое буфер ядра и как его очищать. Найти похожие ветки
← →
Duncan (2003-07-21 13:31) [0]Уважаемые мастера!
Столкнулся я с такой проблемой: моя прога написанная на D6 вызываеи дос-приложение (tethereal) 1 раз в 2 минуты. Приблизительно через 1200 минут запускаемое дос-приложение выдает сообщение типа:"Not enough memory to load tethereal into kernel buffer". Причем пробывал запускать и 1 раз в минуту, эфеект и время работы приблизительно такое же. Оперативки на борту 376Mb, в состоянии системы в результате экспериментов показало наличие минимум 30% свободной оперативки. Помогает только перезагрузка компа, а это иногда не совсем хорошо. Поэтому помогите разобраться как сделать так чтобы очищать буфер или хотябы дотянуть до 1500 минут (сутки).
Спасибо!
← →
mzu (2003-07-23 03:57) [1]Извини, а приложение твоё корректно заканчивается за эти 2 минуты?
← →
Е-Моё имя (2003-07-23 09:15) [2]а если даже некорректно?
все равно интерено, чо это за фигня такая
← →
Duncan (2003-07-23 09:44) [3]Так в том то все и дело, что мое приложение висит в процессах постоянно и запускает дос-приложение каждые 2 минуты. ПОэтому корректность завершения полностью возлагаю на винды. Хотя может конечно и стоит (и надо ли) освобождать хендлы, но я не умею, поэтому подскажите плиз надо ли и как и в какой момент. Вот код запуска:
GetStartupInfo(StartupInfo);
with StartupInfo do begin
wShowWindow := SW_HIDE; //не показывать окно
( nil, PChar(pr+"a.bat") Так в том то все и дело, что мое приложение висит в процессах постоянно и запускает дос-приложение каждые 2 минуты. ПОэтому корректность завершения полностью возлагаю на винды. Хотя может конечно и стоит (и надо ли) освобождать хендлы, но я не умею, поэтому подскажите плиз надо ли и как и в какой момент. Вот код запуска:
GetStartupInfo(StartupInfo);
with StartupInfo do begin
wShowWindow := SW_HIDE; //не показывать окно
dwFlags := STARTF_USESHOWWINDOW; end;
CreateProcess(nil, PChar(pr+"a.bat"), nil, nil, FALSE, CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInformation);
← →
Spawn (2003-07-23 11:20) [4]А ты TerminateProcess то делаешь?
← →
Duncan (2003-07-23 11:33) [5]Нет не делаю. А кстати, что лучше в данном случае делать
TerminateProcess(ProcessInformation.hProcess,???);
TerminateProcess(ProcessInformation.hThread,???);
или
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
← →
VMcL (2003-07-23 14:15) [6]>Duncan (23.07.03 11:33)
CloseHandle - освобождает HANDLE. TerminateProcess - прерывает процесс. Подробнее: см. г-на Рихтера и т. п.
← →
VMcL (2003-07-23 14:18) [7]>Duncan (23.07.03 11:33)
Кстати, я подозреваю, что из-за того, что ты не вызываешь CloseHandle, запускаемое дос-приложение выдает сообщение типа:"Not enough memory to load tethereal into kernel buffer"
Причём, не дос-приложение это выдает, а ядро Windows, AFAIU.
← →
Duncan (2003-07-23 14:50) [8]Вполне возможно, сейчас поставил на тест новую версию, результат будет завтра, вот и посмотрим. Но возникает вопрос следующего плана: я пробывал запускать ежеминутно, т.е. в 2 раза чаще, логично предположить что и буфер должен быть засорен в 2 раза быстрее, однако прога все-равно выдает ошибку через примерно 1200 минут. Почему?
← →
Переяслов Григорий (2003-07-23 14:54) [9]А под Win2K или XP не пробовал?
← →
Duncan (2003-07-23 15:16) [10]Пробовал под 2000 на 1 машине выдал что не может найти точку входа в процедуру CreateProcess, на 2 машине запустился хорошо, но сам tethereal (который я запускаю) не нашел интерфейс с которого надо считывать и поэтому просто закрывался :-(. Пробовал еще на 1 машине с линолиумом, но там оперативки меньше (128М), поэтому примерно через 5-6 часов работы выдавал, что не достаточно памяти для запуска программы (причем говорили сами винды) - эта ошибка вполне может быть связанна именно с не использованием CloseHandle.
← →
dokdok (2003-07-23 21:53) [11]Уж простите, кинул просто фрагмент - прога живая, запускает всякие DOS-овые теликсы, батники, месяцами напролет...
Может пригодится
if not ProcIsLive(Job.ProcId) then
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
if Job.B1 then
si.wShowWindow := SW_SHOWMINNOACTIVE
else
si.wShowWindow := SW_SHOWNORMAL;
if not CreateProcess(nil, PChar(ListViewJob.Items[TRxTimerEvent(Sender).Tag].SubItems[3]), nil, nil, False, 0, nil, nil, si, pi) then
begin
ShowMessage( "CreateProcess failed." );
Exit;
end;
Job.ProcId := pi.dwProcessId;
with ListViewLog.Items.Add do
begin
Caption := ListViewJob.Items[TRxTimerEvent(Sender).Tag].Caption;
ImageIndex := 7;
SubItems.Add(DateToStr(Date)+ " " + TimeToStr(Time));
SubItemImages[0] := 11;
SubItems.Add(idUDPClient.LocalName);
SubItemImages[1] := -1;
SubItems.Add(ListViewJob.Items[TRxTimerEvent(Sender).Tag].SubItems[3]);
SubItems.Add("ProcessID - " + IntToStr(Job.ProcId));
//
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c