Thread creation error недостаточно памяти для обработки команды
А разве локальные объектные переменные не уничтожаются автоматом?
P.S. Попробуй в конце функции после
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
А разве локальные объектные переменные не уничтожаются автоматом? |
Нет кончено )
И потом функция возвращает. Значит нужно для дальнейшей работы за ее пределами. А вот освобождение за ее пределами сделано или нет мы не знаем.
А разве локальные объектные переменные не уничтожаются автоматом? |
А разве локальные объектные переменные не уничтожаются автоматом?
P.S. Попробуй в конце функции после
Простите, но эта функция вызывает такую же ошибку, как и Bitmap.Free: 'Access violation at adress . '.
Локальную переменную освобождать ручками не надо. Она сама собой "освободится". Но ты в коде своём создал объект типа TBitmap, система выделила тебе память для него. Если тебе этот объект на каком-то этапе программы стал не нужным, то надо освободить память выделенную ему.
Саша40, ты когда-нибудь начнешь думать перед тем как отвечать?
Внутри функции создали объект класса TBitmap, ссылку на него присвоили неявной переменной Result и сразу после этого уничтожили этот объект. Что же тогда получила программа вызвавшая эту функцию?
как освободить локальную переменную вне функции? к тому же эта функция вынесена в отдельный юнит. |
Локальную переменную освобождать ручками не надо. Она сама собой "освободится". Но ты в коде своём создал объект типа TBitmap, система выделила тебе память для него. Если тебе этот объект на каком-то этапе программы стал не нужным, то надо освободить память выделенную ему.
Не понимаю, ведь битмап объявлен переменной в самой функции и, следовательно, является локальной переменной, как мне вне функции тогда ее освободить?
Она выделяет пикселы определенного уровня серой градации на изображении. Я использовал функцию, так как много раз вызываю.
Переделал в процедуру, без создания нового битмапа, больше проблемы не возникает, спасибо.
Содержание ComboBox’ов (ItemIndex = -1 если задал имя файла ):
нет
100 Гц, 1 гудок
100 Гц, 2 гудка
200 Гц, 1 гудок
200 Гц, 2 гудка
300 Гц, 1 гудок
300 Гц, 2 гудка
500 Гц, 1 гудок
500 Гц, 2 гудка
700 Гц, 1 гудок
700 Гц, 2 гудка
1000 Гц, 1 гудок
1000 Гц, 2 гудка
1500 Гц, 1 гудок
1500 Гц, 2 гудка
2000 Гц, 1 гудок
2000 Гц, 2 гудка
type
TPlayToneThread = class(TThread) // Поток проигрывания тона
private
Frequency: integer; // Частота тона, Гц
Duration: integer; // Длительность выдачи тона, мс
Count: integer; // Кол-во выдаваемых тонов
protected
procedure Execute; override; // Исполняемая часть
end;
//----------------------------------- Выдать на динамик тон ----------------------------------------
procedure Sound(Frequency, Duration: Integer);
asm
push edx
push eax
mov eax, Win32Platform
cmp eax, VER_PLATFORM_WIN32_NT
jne @@9X
call Windows.Beep
ret
@@9X:
pop eax
pop edx
push ebx
push edx
mov bx, ax
mov ax, 34DDh
mov dx, 0012h
cmp dx, bx
jnc @@2
div bx
mov bx, ax
in al, 61h
test al, 3
jnz @@1
or al, 3
out 61h, al
mov al, 0B6h
out 43h, al
@@1:
mov al, bl
out 42h, al
mov al, bh
out 42h, al
call Windows.Sleep
in al, 61h
and al, 0FCh
out 61h, al
jmp @@3
@@2:
pop edx
@@3:
pop ebx
end;
//--------------------------------- Реализация потока проигрывания тона ----------------------------
procedure TPlayToneThread.Execute;
begin
FreeOnTerminate:=True; // По завершению работы освободить память
while Count>0 do
begin
Sound(Frequency,Duration);
sleep(Duration);
dec(Count);
end;
Terminate; // На всяк случай завершаем поток
end;
//--------------------------------- Процедура завершения потока ------------------------------------
procedure TfmOSC_Buzzer.end_thread(Sender: TObject);
begin
PlayToneThread:=nil; // На всяк случай уничтожаем объект
end;
//-------------------------------------- Проиграть звук --------------------------------------------
procedure TfmOSC_Buzzer.play_sound(cbSound: TComboBox; play: boolean = false);
const
Duration: integer = 75;
var
Frequency, Count: integer;
begin
if cbSound.ItemIndex=0 then exit; // Если нечего проигрывать то выходим
if cbSound.ItemIndex try
sndPlaySound(PChar(cbSound.Text),SND_ASYNC); // то просто проигрываем его
except
end
else begin
Frequency:=StrToInt(Trim(Copy(cbSound.Text,1,4))); // Определили частоту и кол-во гудков
if Odd(cbSound.ItemIndex) then Count:=1 else Count:=2;
if IsWindowsNT then
begin
if PlayToneThread<>nil then // Если поток существует
if not PlayToneThread.Terminated then // Да он еще и не завершен
begin
if play then // Если нужно проиграть
PlayToneThread.Terminate // то завершили поток
else // Если событие
exit; // то выходим
end;
PlayToneThread:=TPlayToneThread.Create(true); // Создаем поток
PlayToneThread.OnTerminate:=end_thread; // Задали процедуру завершения
PlayToneThread.Priority:=tpNormal; // Задаем нормальный приоритет потоку
PlayToneThread.Frequency:=Frequency;
PlayToneThread.Duration:=Duration;
PlayToneThread.Count:=Count;
PlayToneThread.Resume; // Запускаем поток
>
<>
while Count>0 do
begin
Sound(Frequency,Duration);
sleep(Duration);
dec(Count);
end;
<>
end
else begin
while Count>0 do
begin
Sound(Frequency,Duration);
sleep(Duration);
dec(Count);
end;
end;
end;
end;
Ошибка «Недостаточно памяти для обработки команды» встречается на серверах Windows и возникает при неправильно установленном значении реестра, а также после сброса или переустановки.
Для ее решения Майкрософт рекомендует изменить значение в определенном разделе реестра. Если проблема сохраняется, нет другого выбора, кроме как выполнить восстановление системы.
Переустановка драйвера видеокарты
Если ошибка возникает при запуске игры, возможно, что драйвер видеокарты поврежден или устарел. Для решения его нужно полностью удалить перед установкой нового, поэтому потребуется утилита DDU (Display Driver Uninstaller). Загрузите утилиту с официального сайта.
После установки перезапустите компьютер в безопасном режиме. Если используете Windows 10, откройте меню Пуск, кликните на кнопку Питания и, удерживая клавишу Shift, нажмите на Перезагрузку.
В среде восстановления перейдите по пути Поиск и устранение неисправностей – Дополнительные параметры – Параметры загрузки, затем нажмите на F4, чтобы загрузить систему в безопасном режиме.
Запустите DDU, укажите графический процессор и выберите первый вариант «Удалить и перезагрузить». Приложение автоматически удалит текущие драйвера, затем перезагрузит компьютер.
Запустите приложение GeForce Experience, откройте вкладку «Драйверы» и скачайте последнюю версию.
После обновления перезапустите ПК. Проверьте, исправлена ли ошибка. Если видите, что для обработки команды по-прежнему недостаточно ресурсов памяти перейдите к следующему способу.
Также обновить драйвер можно путем загрузки из сайта NVIDIA или AMD и последующего запуска загруженного файла.
Решение 1. Измените значение IRPStackSize.
- Выберите «Пуск»> «Выполнить»> введите regedit> hit и нажмите «ОК».
- Найдите и выберите следующий подраздел реестра:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters - Если запись IRPStackSize недоступна, выполните следующие действия:
- Нажмите «Правка»> «Создать»> нажмите «Значение DWORD».
- Введите IRPStackSize > и нажмите клавишу ВВОД. Введите IRPStackSize точно так, как оно выглядит. Не забывайте, что имя значения чувствительно к регистру.
- Выберите IRPStackSize> Изменить> Изменить.
В поле «Значение данных» введите большее значение> нажмите «ОК». Значения могут находиться в диапазоне от 0x1 до 0xC и эквивалентны от 1 до 12 в десятичной записи.
Если проблема не устраняется после изменения значения, повторите те же действия и снова увеличьте значение IRPStackSize.
- ЧИТАЙТЕ ТАКЖЕ : не удается получить доступ к редактору реестра в Windows 10 [FIX]
Действия по исправлению Недостаточно памяти для обработки этой команды
- Изменить значение IRPStackSize
- Изменить значения SharedSection
- Блокировать пользовательские интерфейсы приложений
- Обновите Microsoft SQL Server
- Удалить временную папку
Следующие решения включают в себя изменение реестра. Тем не менее могут возникнуть серьезные проблемы, если значения реестра изменяются неправильно. Не забудьте создать резервную копию реестра, прежде чем вносить изменения. Таким образом, вы всегда можете восстановить его, если что-то пойдет не так.
Решение 2 – Изменить значения SharedSection
- Откройте редактор реестра> найдите следующий подраздел
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ ControlSession \ Manager \ SubSystems - Выберите значение Windows> перейдите в меню «Правка»> выберите «Строка».
- Увеличьте параметр SharedSection.
- Windows NT использует следующий формат: SharedSection = xxxx, гггг
Добавьте «, 256» или «, 512» после числа гггг. - В Windows 2000, Windows XP и Windows Server 2003 используется следующий формат: SharedSection = xxxx, yyyy, zzzz
Для 32-разрядных операционных систем увеличьте значение yyyy до «12288»; увеличьте значение zzzz до «1024».
Для 64-разрядных операционных систем увеличьте значение «гггг» до «20480»; увеличьте значение zzzz до «1024».
Решение 4 – Обновите Microsoft SQL Server
Установите последние обновления Microsoft SQL Server, чтобы убедиться, что ваша система использует последние улучшения и исправления. Для получения дополнительной информации о доступных обновлениях перейдите в Центр обновлений для Microsoft SQL Server.
Внесение изменений в системный реестр
В большинстве случаев устранить проблему с недостаточно выделенной памятью для обработки команды можно путем использования официального решения. Для его применения требуется доступ администратора. Нужно внести изменения в раздел. Если его нет, создадим вручную.
Примечание: Параметр «IRPStackSize» нужно поменять на том компьютере, к файлам которого мы обращаемся.
Поскольку будем вносить правки в системный реестр, рекомендуется создать резервную копию. Для этого разверните меню Файл, щелкните на Экспорт и выберите папку для сохранения копии.
Откройте Редактор реестра командой regedit из окна «Выполнить» (Win + R).
Перейдите по пути к разделу:
Найдите запись IRPStackSize. Если ее не существует, щелкните в правой части окна на пустое пространство, выберите Создать – Параметр DWORD (32 бита).
Установите имя нового параметра «IRPStackSize», щелкните правой кнопкой мыши на него и выберите «Изменить».
В поле значение установите большее число и нажмите на «OK». Значения находятся в пределах от 0x1 до 0xC. Они эквивалентны от 1 до 12 в десятичной системе исчисления.
После внесения требуемых изменений перезагрузите компьютер и проверьте, исправлена ли ошибка. Если она остается, увеличивайте значение до тех пор, пока не будет исправлена.
Решение 5 – Удалить временную папку
Временная папка по умолчанию скрыта, поскольку содержит много файлов конфигурации, которые иногда используются Windows.
Он не предназначен для того, чтобы с ним связываться, поэтому более безопасный вариант – сделать резервную копию папки Temp, просто чтобы быть уверенным.
Вы найдете эту папку в своем разделе Windows, и на вкладке «Просмотр» вам нужно будет проверить скрытые элементы, чтобы увидеть ее. Или вы можете попробовать так:
- Нажмите Windows + R и введите «% temp% » в открывшемся диалоговом окне. Затем нажмите Enter.
- Нажмите Ctrl + A , чтобы выбрать все файлы, и нажмите Удалить .
- Теперь перейдите на установочный диск Windows, обычно (C :), найдите временную папку и удалите все файлы там же.
После перезагрузки компьютера проблема должна исчезнуть.
Как всегда, если вы сталкивались с другими решениями для исправления Недостаточно места для обработки этой команды, вы можете перечислить шаги по устранению неполадок в разделе комментариев ниже.
Решение 3 – Заблокировать вилки пользовательского интерфейса
Если важному приложению не хватает памяти, вы можете перезапустить его. Ошибка временно исчезнет. Однако в куче рабочего стола для службы оконной станции снова возникнут проблемы с памятью.
Чтобы навсегда решить эту проблему, настройте xyzService.exe, который исчерпывает память, чтобы избежать разветвлений приложений пользовательского интерфейса в сеансе 0. Вот как пользователь BlueCode описал решение, принятое для этой конкретной ситуации:
После разговора с клиентом я выяснил, что вся история в том, что клиент запустил xyzService.exe с учетной записью домена DOMAINxyzServiceAccount в сеансе 0, а xyzService.exe каким-то образом разветвляет дочерние процессы xyzUIApplication.exe. К сожалению, приложение пользовательского интерфейса не выходило как обычно. Эта операция постепенно пропускала кучу рабочего стола в этой конкретной оконной станции Service-0x6-453186fc $, пока xyzService.exe не обнаружил истощение во время выполнения запросов.
Чтобы решить эту проблему, мы просто настроили xyzService.exe и сделали так, чтобы он не разветвлял приложение пользовательского интерфейса в сеансе 0.
Удаление файлов временной папки
Если продолжаете наблюдать, что недостаточно требуемой памяти для обработки этой команды, попробуйте очистить временную папку. Эта папка содержит много системных конфигураций, которые иногда используются системой. Можно всегда создать ее резервную копию, если потребуется вернуть обратно.
Нажмите Win + R, чтобы вызвать окно «Выполнить», наберите %temp% и щелкните на «ОК».
Совместным нажатием Ctrl + A отметьте все записи, кликните на кнопку Удалить.
После перейдите на локальный диск C, откройте каталог Temp и также очистите все содержимое. Перезагрузите ПК и посмотрите, возникает ли ошибка, указывающую на недостаточную память при обработке команды.
но дает ошибку : thread creation error недостаточно памяти для обработки команды . как мне от нее избавиться ? чтоб не выдавало у меня ее ? как я понял ошибка вылетает в результате функции repeat- until , но если их убрать , то поток не закончит дело до конца (а именно гет запрос по ссылкам) подскажите, как быть ?
Правильно ли организован поток?
Всем доброго времени суток, задался таким вопросом, а правильно ли составлен этот код потока.
Как правильно вызвать процедуру.
Помогите пожалуйста с вызовом процедур. Вот у у меня есть процедура сортировки: procedure.
Как правильно вызвать поток в консольной программе
Всё! Совсем завяз, уже создал пустой проект, чтобы разобраться с этими потоками. Гугл уже снится.
Вызвать событие в контексте класса, породившего поток
Здравствуйте. 1. Есть класс "сервер". 2. В классе определено событие, которое отвечает за.
Ты ж этих потоков наплодил туеву хучу одновременно, а ведь каждый из них требует минимум 1 Мб вирт.памяти в пространстве процесса ! А оно не резиновое, пространство это. - для размещения пользовательских данных, кода и стеков процессу Win32-система может выделить не более 2 Гб
Вот и считай сколько объектов-потоков можно теоретически создать одновременно)
А практически и того меньше. Да и бессмысленно плодить потоки в количестве большем чем кол-во ядер CPU, поддерживаемое опер.системой.
понимаю, а как можно тогда переделать ? мне тут подсказали об TThreadList , но вот никак не могу с ним разобраться . надо проверять кол-во работающих потоков и если их мало , то создавать новый поток и дописывать его в список, хранящий работающие потоки.
Не мог ли ты мне показать пример кодом ? нашел что-то вроде этого :
как правильно вызвать sub?
Назрело несколько ворпросов об использовании sub'ов 1)как правильно вызвать sub,почему если я.
Как правильно вызвать JS
Здравствуйте. Есть код: <a btn-success waves-effect waves-light" href="javascript:;".
Правильно завершить поток
Прошу помощи людей, хорошо разбирающихся в многопоточности. Из-за зависания формы приложения во.
Как правильно вызвать процедуру?
как правильно вызвать данную процедуру? procedure n1(i:integer; A:T1); begin for I := 1 to 3 do.
Как правильно вызвать функцию?
как вызвать функцию? int sum_last(list_ptr a) < list_ptr ptr; assert(NULL != a);.
Microsoft объясняет, что эта ошибка может возникать, если для параметра реестра IRPStackSize на сервере задано слишком низкое значение. В результате, лучший и самый простой способ решить эту проблему – настроить реестр, чтобы выделить большее значение IRPStackSize.
Читайте также: