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

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск № 24


Информационный Канал Subscribe.Ru

C/C++ Вопрос-Ответ

Выпуск      : 24
Подписчиков : 1624
Cайт        : SoftMaker.com.ru
Архив       : C/C++ Вопрос-Ответ (архив)
В этом выпуске
От ведущего

Здравствуйте уважаемые подписчики !

Как всегда, рад приветствовть вас на страницах этой рассылки.
Напоминаю, что, как обычно, вы можете отправить свои пожелания (замечания, предложения, сообщения об ошибках) по поводу рассылки и сайта по этому адресу.
Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций.

С уважением, Вахтуров Виктор.

Подписчикам

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

Для того, чтобы задать свой вопрос, пришлите письмо, кликнув по этой ссылке.
Для того, чтобы ответить на вопрос, надо кликнуть по ссылке "ответить", расположенной под текстом вопроса.

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 91 ( Alexey Kardash )

Здравствуйте. Меня зовут Алексей. Я занимаюсь изучением MFC еще очень мало времени, поэтому не серчайте если вопрос простой :). Как с помощью MFC вывести на экран список файлов, находящийся в текущей (например корневой) папке и переходить по каталогам вверх и вниз? Выводить список файлов я хочу в CListCtrl, например w_wndList. Как это сделать? Спасибо.

Ответить на вопрос

Вопрос № 92 ( AVG )

Здравствуйте Уважаемый автор и подписчики!
Подскажите пожалуйста как работать с анимацией на Visual C++?
Например нажал на кнопку и раздаются карты и.т.д...
Например как в картах в виндовсе!!!!!!
Заранее спасибо. С уважением, Виктор.
Помогите кто чвм сможет!!!!!

Ответить на вопрос

Вопрос № 93 ( Max116 )

Hi, All !!!
Сегодня такой вопрос. Как создавать свои элементы управления ?
То есть как я понимаю, код стандартных элементов управления Windows находится в некоторых виндовых dll. Для каждого стандартного элемента управления в системе регистрируется свой класс окна. Также свой класс окна можно зарегистрировать и в своем приложении и использовать окна такого класса.

Я научился создавать свои элементы управления, но только для своего приложения (пишу в Visual C, использую MFC). Я создаю класс, наследованный от CWnd, а потом реализую обработчики WM_PAINT, сообщений мыши, клавиатуры, и.т.д.

Но вот тут и вопрос.
Как сделать так, чтобы любое приложение (написанное на любом языке) могло использовать мои элементы управления ? То есть, если там будет создано окно класса MyCoolControl, то вызвался бы код в моей dll, создался бы объект моего класса CMyCoolControl, и начали бы обрабатываться сообщения в моей длл ?

Если кто знает, поделитесь информацией, плиз. Или ссылочками.

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 90 ( formax )

Здравствуйте.
В своей программе, написанной в Builder 5.0 использовал диалог выбора
каталогов: SelectDirectory(dir, TSelectDirOpts(), SELDIRHELP).

Программа должна была запускаться с машины без Builder-библиотек.
Когда я попытался в меню Project->Options->Packages снять флажок
«Build whith runtime packages» для отключения использования пакетов
времени выполнения(цитата полность взята из этой рассылки), получил
вместо работающей программы сообщение:

[Linker Error] Unresolved external '__fastcall Filectrl::SelectDirectory(System::AnsiString&, System::Set<Filectrl::TSelectDirOpt, 0, 2>, int)' referenced from E:\PROJ\UNIT1.OBJ

Кто подскажет, кого ему надо?

Ответ ( 3V )

Судя по описанию ошибки, не хватает библиотеки из которой экспортируется эта функция (или библиотеки статической линковки). Фактически это означает, что есть h-файл, в котором объявлена данная функция (в данном случае - метод класса) и Вы его используете (вызываете), но линкер не может найти библиотеку, в которой содержится код этой функции.
Вот он и пишет о неразрешенных именах.
Надо подключать статические библиотеки. исполняемый файл будет, правда, гораздо больше.
Вопрос № 91 ( Aury )

Здравствуйте.
Недавно начал разбираться с объектами синхронизации Windows (критическая секция, мьютекс, семафоры). Но вот я немного не понимаю. Есть критическая секция и мьютекс. это почти одно и то же ? И в каких случаях их лучше использовать. В каких случаях мьютекс, в каких крит. секцию.

Буду очень благодарен за ответ.

Ответ ( Сорокин Евгений Николаевич )

Здравствуйте, q.

Когда твой процесс, поток или волокно(облегчённый поток) входит в критическую секцию, он использует мьютекс, который устанавливается в отличное от нуля (false) значение(true)(Семафор в этом случае считает сколько процессов потоков или волокон уже вошло в критическую секцию и в случае превышения определённого числа блокирует дальнейший доступ новых процессов, потоков или волокон к критическому участку кода.) В результате ни один другой поток не сможет войти в критический участок программы(критическую секцию). Другой поток, запросивший доступ к критической секции в случае если мьютекс на него захвачен первым процессом, будет заблокирован, до момента освобождения мьютекса. А вообще советую тебе вот эту книгу http://www.piter.com/book/978531800299/ там всё очень хорошо описано

Ответ ( Шматко А.А. )

Это "почти" одно и то же. В этом ты прав. И служат они для одной и той же цели. Но есть и "существенные разницы".
Критические секции оптимизированны для работы в количестве сотен и тысяч штук в каждом приложении. Они требуют мало ресурсов OC, потребляя в основном ресурсы приложения, и очень быстры. При относительно редко возникающих коллизиях между нитями производительность приложения слабо падает даже при очень частых вызовах EnterCriticalSection() и LeaveCriticalSection(). Я как-то смотрел в отладчике, код этих функций в Kernel32.dll от Win9x занимает всего чуть больше десяти ассемблерных инструкций. Ресурсы ОС начинают потребляться как раз при реально случающихся коллизиях (хотя это зависит от способа инициализации критической секции). Пока их нет, и ресурсы свободны. Но и в граничном случае, когда ресурсы ОС будут "востребованы"
всеми критическими секциями, они не обгонят мьютексы. Достигается это путём того, что приложение создаёт критические секции, непосредственно объявляя их в своей программе как переменные. InitializeCriticalSection() и иже с ней только инициализируют поля этой структуры. Аналогично
DeleteCriticalSection() служит для освобождения ресурсов OC, которые (и
если) были распределены для её поддержки. Функции EnterCriticalSection() и
LeaveCriticalSection() используются для пометки "занят/свободен" и подсчёта количества "занятий" текущим владельцем, каковым является нить. Это всё происходит быстро, и если критическая секция захватывается ненадолго (читай, вероятность межнитевых коллизий невелика), то они существенно обгоняют мьютексы по производительности. Кроме того, во многопроцессорных системах (а также на HyperThreading-овых) ОС может избежать приостановки нити на попытке завладеть "занятой" критической секцией, используя тривиальные пустые циклы.
Опять-таки, если критическая секция "занимается" ненадолго, то это быстрее, чем останавливать нить и снова её пробуждать. Количество этих циклов также настраивается, например InitializeCriticalSectionAndSpinCount().
Однако если две ложки дёгтя. Во-первых, тот факт что критические секции лежат где-то в самом приложении, они обладают важным ограничением - они не могут разделяться разными процессами. То есть, их можно использовать только в текущем приложении. Если необходимо осуществлять не только межнитевую, но и межпроцессную синхронизацию, критические секции не подойдут. Сразу предупреждаю возможные вопросы: никакие изощрения типа, memory-mapped files итп не пройдут. Будет только хуже. Во-вторых, их невозможно комбинировать как с другими критическими секциями, так и вообще с другими объектами синхронизации. Только EnterCriticalSection() (с бесконечным таймаутом) или
TryEnterCriticalSection() (с нулевым таймаутом) по критической секции за раз и LeaveCriticalSection(). И всё. Поэтому сложные конструкции из них не соорудишь.
Мьютексы являются полноценными объектами уровня ядра. Могут разделяться разными процессами, комбинироваться с любыми другими объектами синхронизации (кроме критических секций, конечно) в WaitForMultipleObjects(), например, иметь таймаут в ожидании отличный от нуля и бесконечности. Обладать правами и атрибутами доступа, наконец. Короче, полноценный объект синхронизации. Вот только каждое действие с ними вызывает переключение на уровень ядра для обслуживания соответствующими службами ОС. Поэтому они гораздо медленнее критических секций и потребляют ресурсы ОС, а не приложения. Не следует однако думать, что они "медленные" вообще. Во-первых, не больше, чем любой другой объект синхронизации (кроме... ну ты понял), а во-вторых - это по сравнению с критическими секциями. ~12000 тактов - это на 2Г процессоре 5 микросекунд. "~12000 тактов" - это оценка "по максимуму" "независимых экспертов" на моей бывшей работе в КБ.
Краткое резюме: критические секции идеальны для использования в приложении, когда необходимо предотвратить исполнение некоего кода функции более чем одной нитью одновременно. Стандартные rtl-библиотеки у себя используют в подавляющем большинстве случаев именно их. Использовать мьютексы вместо критических секций нужно IMHO только, если критические секции не подходят ввиду их ограничений, перечислявшихся выше.

Ответ ( Novikov Alexander )

Hello q,

Мьютекс и критическая секция - работают "приблизительно" одинаково.
Но у критической секции есть несколько плюсов:
Она работает быстрее и рекрурсивна ( т.е. есть возможность
"знаимать" секцию сколько угодно раз в пределах одного потока ).
Мьютекс отличается тем, что может быть глобальным (видимым для всех
приложений) и именнованым.
Т.е. можно создать глобальный мутекс для атомарного доступа к
какому-либо ресурсу для разных приложений.
Часто используется для того, чтобы запретить запуск более одной
копии приложения.
Вопрос № 92 ( Basing )

Скажите пожалуйста, как можно из своей программы записать все действия пользователя с мышью? А потом желательно еще научиться их воспроизводить?

Но хотя бы просто как например в файл записывать все координаты где побывала мышь за некоторое время так, чтобы при этом на экране не было окна записывающей программы?

Ответ ( Шматко А.А. )

Тебе вполне подойдут ответы на вопрос 87.

Ответ ( 3V )

Надо использовать хуки.
В прошлом выпуске про них писали.
Надо просто ознакомиться с документацией по SetWindowsHookEx.
Вообще полезно почитать книжку Рихтера "Programming Applications For Microsoft Windows" (на русском в инете лежит "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" - то же самое) там и про хуки написано, и много еще про что.
Книги по C/C++
Visual C++ и MFC. Руководство для профессионалов.
Visual C++ и MFC. Руководство для профессионалов.

Автор: А. Мешков, Ю. Тихомиров.

Книга посвящена объектно-ориентированному программированию для 32-х разрядных систем Windows семейств 9x и NT с использованием компилятора Visual C++ 6 и библиотеки классов MFC версии 4.23.
Книга содержит исчерпывающую информацию о библиотеке классов MFC и методах создания приложений Windows на основе классов этой библиотеки, а также большое количество наглядных и подробно прокомментированных примеров приложений, полные тексты которых приведены на сопроводительной дискете.

Эта книга - для программистов, владеющих языками С и С++ и имеющих опыт программирования в системе Windows

Страница книги на Озоне
Решение сложных задач на С++ [ Exceptional C++ ]
Решение сложных задач на С++ [ Exceptional C++ ]

Автор: Герб Саттер

В данном издании объединены две широко известные профессионалам в области программирования на C++ книги Герба Саттера Exceptional C++ и More Exceptional C++, входящие в серию книг C++ In-Depth, редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week, рассчитанные на читателя с достаточно глубоким знанием C++, однако книга будет полезна каждому, кто хочет углубить свои знания в этой области.

Страница книги на Озоне
Всего доброго. До встречи в следующем номере.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Отписаться

В избранное