На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> thread creation error insufficient memor , Как бороться с “thread creation error: Мало памяти
    Мастера подскажите, как бороться с “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 гудка

    ExpandedWrap disabled
      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;


    M
    Используем тег code!
    Сообщение отредактировано: Song -
      Надо же код выделять тегами. Что в правилах написано?
      Цитата

      Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


      Добавлено
      На такой код и смотреть не хочется, а не то что изучать.
        Говоришь под ХР, а как тогда понимать обращение к регистрам?
          >Говоришь под ХР, а как тогда понимать обращение к регистрам?

          >Говоришь под ХР,
          Пишу по XP, а прога должна работать как под 98, так и под NT.

          >а как тогда понимать обращение к регистрам?
          Элементарно:
          mov eax, Win32Platform – определили тип платформы
          cmp eax, VER_PLATFORM_WIN32_NT – проверили это NT
          jne @@9X - если нет то сами генерируем тон
          call Windows.Beep – если да то вызвали стандартную пищялку
          ret
          @@9X:
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0.0629 ]   [ 16 queries used ]   [ Generated: 4.07.26, 09:44 GMT ]