Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

Как бороться с “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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
1-1108047557
ali_tash
2005-02-10 17:59
2005.02.27
ещё раз про SWAP


1-1107939243
chup
2005-02-09 11:54
2005.02.27
Печать в Word


14-1107994121
iZEN
2005-02-10 03:08
2005.02.27
Microsoft Expression


1-1108013410
Atrion
2005-02-10 08:30
2005.02.27
RegKey.ReadBinaryData нужно Binary в String


1-1108252908
NickKuz
2005-02-13 03:01
2005.02.27
Что это за Exception кто знает?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский