Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

Как бороться с “thread creation error: Недостаточно памяти для...   Найти похожие ветки 

 
msn777   (2005-01-16 20:39) [0]

Мастера подскажите, как бороться с “thread creation error: Недостаточно памяти для обработки команды”, говорит, что, мол, мало памяти, хотя под стек выделено 256M  {$M 16384,268435456}, на машине стоит 512М, в диспетчере задач приложение показывает, что для приложения выделено около 5M. Пишу на Delphi 7 под WinXP.
Может, кто сталкивался с такой бедой, из каких соображений принимается решение, что не хватает памяти. До того как в проге было мало элементов (меньше сотни кнопок, меток и т.д.) такое сообщение не выскакивало, сейчас их несколько сотен, такое сообщение выскакивает, после того, как вызываю play_sound для проигрывания wav файла, но ф-н sndPlaySound все время выдает FALSE, хотя перенес этот модуль из старого проекта там все работало, а после этого еще раз play_sound но для пробирования тона, процесс (Thread) созданный sndPlaySound так и остается, а звука нет. Причем если вызывать sndPlaySound с тем же именем файла, но указанным как константа – звук есть, если же переменная (PChar) – звука нет.

Содержание 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<0 then                           // Если это *.wav файл
   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;


 
tesseract   (2005-01-18 16:45) [1]

ОГО а ты ASM значит знаешь. А разницу между PCHAR и PCHAR^ нет?


 
Digitman ©   (2005-01-18 17:16) [2]

галиматья какая-то



Страницы: 1 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
14-1107997747
Soft
2005-02-10 04:09
2005.02.27
Операция "Монарх" стратовала!


14-1107366522
Narik
2005-02-02 20:48
2005.02.27
explorer.exe глючит!!!


1-1108300149
Кирилл
2005-02-13 16:09
2005.02.27
Сохранение картинки в файл и последущая ее загрузка:)


6-1103163658
Rat
2004-12-16 05:20
2005.02.27
Запуск приложения с другого компьютера


1-1108457263
speed
2005-02-15 11:47
2005.02.27
Hint...