msn777
Гость
|
|
« : 16-01-2005 18:33 » |
|
Мастера подскажите, как бороться с “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;
|