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

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

Что такое буфер ядра и как его очищать.


Duncan ©   (2003-07-21 13:31:00) 

Уважаемые мастера!
Столкнулся я с такой проблемой: моя прога написанная на D6 вызываеи дос-приложение (tethereal) 1 раз в 2 минуты. Приблизительно через 1200 минут запускаемое дос-приложение выдает сообщение типа:"Not enough memory to load tethereal into kernel buffer". Причем пробывал запускать и 1 раз в минуту, эфеект и время работы приблизительно такое же. Оперативки на борту 376Mb, в состоянии системы в результате экспериментов показало наличие минимум 30% свободной оперативки. Помогает только перезагрузка компа, а это иногда не совсем хорошо. Поэтому помогите разобраться как сделать так чтобы очищать буфер или хотябы дотянуть до 1500 минут (сутки).
Спасибо!


dokdok   (2003-07-23 21:53:00) [1]

Уж простите, кинул просто фрагмент - прога живая, запускает всякие 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));
//


Duncan   (2003-07-23 15:16:00) [2]

Пробовал под 2000 на 1 машине выдал что не может найти точку входа в процедуру CreateProcess, на 2 машине запустился хорошо, но сам tethereal (который я запускаю) не нашел интерфейс с которого надо считывать и поэтому просто закрывался :-(. Пробовал еще на 1 машине с линолиумом, но там оперативки меньше (128М), поэтому примерно через 5-6 часов работы выдавал, что не достаточно памяти для запуска программы (причем говорили сами винды) - эта ошибка вполне может быть связанна именно с не использованием CloseHandle.


Переяслов Григорий   (2003-07-23 14:54:00) [3]

А под Win2K или XP не пробовал?


Duncan   (2003-07-23 14:50:00) [4]

Вполне возможно, сейчас поставил на тест новую версию, результат будет завтра, вот и посмотрим. Но возникает вопрос следующего плана: я пробывал запускать ежеминутно, т.е. в 2 раза чаще, логично предположить что и буфер должен быть засорен в 2 раза быстрее, однако прога все-равно выдает ошибку через примерно 1200 минут. Почему?


VMcL   (2003-07-23 14:18:00) [5]

>Duncan (23.07.03 11:33)

Кстати, я подозреваю, что из-за того, что ты не вызываешь CloseHandle, запускаемое дос-приложение выдает сообщение типа:"Not enough memory to load tethereal into kernel buffer"

Причём, не дос-приложение это выдает, а ядро Windows, AFAIU.


VMcL   (2003-07-23 14:15:00) [6]

>Duncan (23.07.03 11:33)

CloseHandle - освобождает HANDLE. TerminateProcess - прерывает процесс. Подробнее: см. г-на Рихтера и т. п.


Duncan   (2003-07-23 11:33:00) [7]

Нет не делаю. А кстати, что лучше в данном случае делать
TerminateProcess(ProcessInformation.hProcess,???);
TerminateProcess(ProcessInformation.hThread,???);
или
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);


Spawn   (2003-07-23 11:20:00) [8]

А ты TerminateProcess то делаешь?


Duncan   (2003-07-23 09:44:00) [9]

Так в том то все и дело, что мое приложение висит в процессах постоянно и запускает дос-приложение каждые 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);


Е-Моё имя   (2003-07-23 09:15:00) [10]

а если даже некорректно?
все равно интерено, чо это за фигня такая


mzu   (2003-07-23 03:57:00) [11]

Извини, а приложение твоё корректно заканчивается за эти 2 минуты?


Наверх

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