Отправляет email-рассылки с помощью сервиса Sendsay

Borland C++ Builder - всякая всячина

  Все выпуски  

Borland C++ Builder - всякая всячина (№17. Особенности разработки консольных приложений)


Служба Рассылок Subscribe.Ru

Приветствую всех получателей рассылки Borland C++ Builder - всякая всячина!

№17. Особенности разработки консольных приложений (Вопрос 1 - приоритет приложения)

"...
Бpитоголовый сказал:
- Hам, господа, следовало бы и здесь навести поpядок.
- У немцев?
- Я имею в виду pусскую эмигpацию. Одних Гитлеp воодушевил, вселил надежды, а дpугие - из этих, опpолетаpившихся, - начали беспокоиться о судьбе отчизны.
- Резать надо, - посоветовал стаpик.
- Hе лишено, - согласился бpитоголовый. - Я кое-кого назвал шефу, пpедложил наши услуги - устpанить собственноpучно. Это имело бы показательное значение, мы бы публично пpодемонстpиpовали нашу готовность казнить отступников. но увы, шеф отказал. Пообещал, что этим займется гестапо.
..."
(В. Кожевников "Щит и меч")

 

Опять в голову лезут мысли странные (см. эпиграф), в связи с чем в этом выпуске опять появилась рубрика "Про ежиков". Читать ее и уж тем более соглашаться со мной я никого не принуждаю - это всего лишь мое личное глубоко субъективное мнение, так что не пинайте сильно...

Теперь - о деле. Я хочу коснуться одной щекотливой темы - создания консольных приложений для Windows. Почему эту тему я считаю щекотливой вы поймете в процессе чтения этой группы выпусков. По крайней мере, мне бы очень хотелось, чтобы вы, мои читатели, поняли смысл рассказываемого до того, как я дойду до последнего вопроса.

Не так давно я столкнулся с необходимостью создать программу, которая должна была принимать данные, поступающие от офисной АТС на последовательный порт. Особенностью данной программы являлось полное отсутствие какого-либо окна на экране, все управление осуществлялось через значок приложения в SysTray (около часиков). Также мне было необходимо, чтобы программа "жрала" минимум ресурсов компьютера (фоновый приоритет и размер exe-файла до 100Kb). Поэтому пришлось отказаться от всех этих удобных компонентов, от визуального программирования и от сладкой жизни. Так что все нижеописанные действия будут производиться только с помощью стандартных функций WinAPI.

Для создания такого консольного приложения выберите пункт меню "File->New...". В открывшемся окне на вкладке "New" укажите вариант "Console Wizard" и нажмите "Ok". Билдер сформирует для вас следующий код:

//---------------------------------------------------------------------------
 
#include
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    return 0;
}
//---------------------------------------------------------------------------

Данный модуль подключает только один файл заголовков - "windows.h" как раз для использования функций WinAPI и вспомогательных структур данных, он мгновенно компилируется в крохотный экзешник, и абсолютно ничего не делает. "Круче" могут быть только горы ассемблерные вставки. Но, хотя программы, созданные таким образом, используют ресурсы наиболее эффективно, часто требуется принудительно урезать отводимое им процессорное время, чтобы, например, они своими длительными вычислениями не тормозили любимый Word пользователя.

Для этого можно воспользоваться функцией назначения класса процесса (читай - приложения) - SetPriorityClass() или функцией назначения приоритета отдельному потоку (Thread) - SetThreadPriority(), а еще лучше - использовать обе этих функции.

Первая из них назначает класс приоритета всему нашему приложению и, соответственно, должна иметь его Handle (грубо говоря - идентификатор запущенного процесса в системе). Его мы получаем в качестве первого аргумента главной функции приложения WinMain - hInstance. Второй аргумент функции SetPriorityClass - это целочисленное значение, определяющее класс приоритета. Он может принимать одно из следующих значений:

  • IDLE_PRIORITY_CLASS - фоновый процесс, выполняемый только тогда, когда нет других задач с более высоким классом.
  • NORMAL_PRIORITY_CLASS - обычный класс приоритета, который имеет подавляющее большинство приложений.
  • HIGH_PRIORITY_CLASS - повышенный класс приоритета, я бы его использовал, к примеру, в играх, активно использующих графическую подсистему.
  • REALTIME_PRIORITY_CLASS - полный "аллес капут". Должна быть очень серьезная причина для использования такого приоритета в обычном приложении. Исключение может составить разве что какая-нибудь программа захвата изображения с внешнего устройства.

Вторая функция в качестве первого аргумента должна получить Handle трэда (нити, потока), для которого требуется сменить приоритет. Handle трэда нашего приложения можно получить вызовом функции GetCurrentThread(). В качестве второго аргумента вы должны указать необходимое значение приоритета. В шестом выпуске я уже рассказывал о классе TThread из библиотеки компонентов VCL, который имеет очень похожее свойство Priority, поэтому я не буду описывать смысл значений и приведу только их названия, которые немного отличаются, в порядке возрастания приоритета:

  • THREAD_PRIORITY_IDLE
  • THREAD_PRIORITY_LOWEST
  • THREAD_PRIORITY_BELOW_NORMAL
  • THREAD_PRIORITY_NORMAL
  • THREAD_PRIORITY_ABOVE_NORMAL
  • THREAD_PRIORITY_HIGHEST
  • THREAD_PRIORITY_TIME_CRITICAL

Вот и все. В соответствии со всем вышесказанным вы должны будете изменить код головной функции WinMain следующим образом (да, чтобы наше творение не выглядело совсем уж бесполезным, воткните туда же цикл с проверкой на нажатие клавиши "Esc", описанный в восьмом выпуске):

//---------------------------------------------------------------------------
 
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    SetPriorityClass(hInstance, IDLE_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE);
    bool Test= true;
    while (Test)
    {
      if (GetAsyncKeyState(VK_ESCAPE)!=0) Test= false;
    }
    return 0;
}
//---------------------------------------------------------------------------

Запустите откомпилированное приложение: оно ничего не делает, вырубается при нажатии "Esc" и, самое главное, не "напрягает" другие запущенные задачи. Особое внимание обратите на то, что это приложение не видно на панели задач (поскольку оно не имеет главного окна) и после переключения на другую задачу "поймать" его и "срубить" можно будет только нажав "Ctrl+Alt+Del".

Пока на этом и остановимся. В следующем выпуске мы продолжим тему консольных приложений.

 

 

"Про ежиков"

Мне показалась очень примечательной и показательной заметка в рассылке "Новости от ОРТ" от 04.12.2001 (9:00). Позволю себе процитировать ее полностью:

Федеральное бюро расследований США приняло решение опросить 5000 иностранных студентов, в основном выходцев из стран Ближнего Востока. Предполагается, что студенты согласятся добровольно ответить на некоторые вопросы агентов ФБР и полицейских. Вопросы, которые намерены задавать студентам ФБРовцы, вполне конкретные: "Где Вы жили и какие штаты посещали, с тех пор как приехали в США? В какие страны выезжали? Когда? С какой целью? Каких политических взглядов Вы придерживаетесь? А Ваши друзья? В каком свете Вы обсуждаете с ними события 11 сентября?" Есть и довольно-таки специфические просьбы: "Сообщите нам номера всех телефонов, которые используете Вы, Ваша семья и Ваши близкие друзья?" Предполагается, что в дальнейшем бюро может решить, что эти телефоны необходимо прослушивать. Опросы студентов еще только начинаются, а недовольство - особенно среди студентов из мусульманских стран - уже налицо. Алтаф Хусаин, президент Ассоциации студентов-мусульман: "Неизбежно возникает тревога и безответные вопросы: "В чем я виноват? Что я сделал? Почему меня в чем-то подозревают?". Многие студенты из стран Ближнего Востока предпочитают уехать из США, чем отвечать на оскорбительные, с их точки зрения, вопросы. Те, которые остаются, выражают обеспокоенность. Студентка: "Я считаю, что мы сейчас сталкиваемся с определенным типом расовой нетерпимости и, я думаю, что такая нетерпимость противоречит и многим законам, и конституции этой страны". Студент: "Такая осведомленность в вопросах частной жизни студентов из определенных стран не кажется мне правильной. Безопасность безопасностью, но оскорблять молодых людей необоснованной подозрительностью - неверно". Странные визиты агентов ФБР в студенческие кампусы - часть новой стратегии ведомства, которая ставит во главу угла недопущение новых терактов. Уильям Лолер, эксперт по вопросам ФБР: "Теперь ведомство может действовать без особых преград: согласно новому закону о борьбе с терроризмом, к студентам можно приходить без ордеров, без судебных решений, без разрешений на обыск". Реакция студенческих ассоциаций и самих студентов на решение ФБР неоднозначная. Никто не спорит, что угроза терроризма в США сегодня вполне реальна, но вопросы личной жизни и безопасности страны приходят в противоречие.

А таперь - мои мысли по этому поводу (сразу отмечу, что лично у меня нет особых сомнений в истинности изложенного материала, от этого и буду плясать):

  • Пала одна из самых главных свобод Америки - свобода самовыражения, свобода личных взглядов. В самом деле, если у тебя спрашивают, каких взглядов ты придерживаешься, то наверное не для того, чтобы проводить статистическое исследование.
  • Вопрос "В каком свете Вы обсуждаете с ними события 11 сентября?" до боли напоминает мне: "Как вы оцениваете решения XXVII Съезда КПСС?"
  • Студенты совершенно не правы в том, что это признаки расовой нетерпимости - это признаки расового деления. Вернее, даже - этнического деления. И не потому, что нет такой расы, как арабская, просто нет такой расы и даже нации (этноса), как американская. Зато есть такое понятие, как Гражданин Великой Державы, и, соответственно "не гражданин". И нет никакой расовой нетерпимости. Пока.
  • Можно только радоваться желанию американского руководства обеспечить достойное существование гражданам своей страны. Можно даже понять то, что они интересы своих граждан ставят выше интересов граждан других государств. Нормальные звериные рефлексы. Но!. Ни один зверь не догадается целенаправленно гадить представителям чужой породы ради выгоды для собственного выводка.
  • По моему сугубо личному мнению, именно это и отличает фашизм (в самом широком смысле этого слова) от обыкновенного национализма. Плюс лидер. Дай бог, чтобы не нашлось в Америке в ближайшее время человека, который сделал бы эту идею "достоянием" нации.
  • Вот такие мысли невеселые, вы уж простите... Если мне докажут, что я в корне неправ, я буду только счастлив.
  • И еще: все мои размышления по поводу заметки вы свободно можете опустить, основная цель, которую я преследовал - сама заметка, прочитайте ее внимательно, я надеюсь, она даст вам пищу к размышлению.


С уважением, Васильев Евгений...
Почта: vasco@homeline.ru
Сайт: http://www.homeline.ru/vasco


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное