Сегодняшняя статья вдохновила меня поделиться своим способом вынесения баз данных в отдельный тред. Способ подходит не только для БД, но и для любых взаимодействий, описываемых паттерном «в отдельном потоке живёт какой-то объект, надо у него что-то спрашивать и что-то с ним делать». Кроме того, способ хорош тем, что он пытается быть типобезопасным и расширяемым: никаких stringly-typed QMetaObject::invokeMethod()
, никаких передач результатов дёрганья объекта в потоке через сигналы. Только прямой вызов функций, только QFuture
!
Читать полностью »
Рубрика «c++11» - 8
Давайте взглянем на эти два языка внимательнее. Что важно для прилежного программиста? Чтобы его код был удобочитамым, дабы в любой момент, спустя любое время можно было изменить этот код.
C++
Чему учит нас C++, что он нам говорит, какие парадигмы он воздвигает?
1. Что можно именовать типы, методы и переменные маленькими буквами
std::list<std::string> L;
L.push_back(50);
L.push_front(-50);
Вы спросите, что же плохого в именовании элементов маленькими буквами?
А то, что, во-первых, C++ не различает контекст типа и контекст переменной и функции! И вы не можете никак взять и объявить поле, скажем, size size или point point! Поэтому, имеет смысл именовать функции и переменные маленькими буквами, но только если тип именуется в стиле C#, а именование типа маленькими буквами портит весь смысл такого действия! А смысл заключается в невозможности пересечения имени типа и его членов!
Ну, а во-вторых, именование как C#, выглядит солиднее, красивее.
Хотя, конечно, вы можете именовать именно так как сейчас предложено, но не факт, что другие будут следовать этому правилу.
Читать полностью »
Гидропоника на подоконнике или C++11 в микроконтроллерах AVR
2015-10-11 в 17:02, admin, рубрики: ATMEGA328P, avr, c++11, DIY, diy или сделай сам, DS3231, I2C, SSD1306, валкодер, гидропоника, программирование микроконтроллеров, Электроника для начинающихПроект не содержит Ардуино

Этот проект изначально должен был выглядеть иначе — монументальное сооружение, состоящее из тумбы с канистрами и насосами, водружённого на неё аквариума и помидорного оазиса поверх него. В райских кущах помидорного оазиса планировался водопад, а в аквариуме — рыбные формы жизни, главное требование к которым — умение поедать незапланированных жителей аквариума и держать в чистоте стёкла; основные кандидаты — сомики и гурами. Как вы уже могли догадаться, мой девиз — «лень — двигатель прогресса» (и чего только не сделаешь, чтобы аквариум не чистить и помидоры не поливать).
Читать полностью »
4.2 Разделённое владение shared_ptr
Не у каждого объекта может быть один владелец. Нам надо убедиться, что объект уничтожен и освобождён, когда исчезает последняя ссылка на него. Таким образом, нам необходима модель разделённого владения объектом. Допустим, у нас есть синхронная очередь, sync_queue, для общения между задачами. Отправитель и получатель получают по указателю на sync_queue:
void startup()
{
sync_queue* p = new sync_queue{200}; // опасность!
thread t1 {task1,iqueue,p}; // task1 читает из *iqueue и пишет в *p
thread t2 {task2,p,oqueue}; // task2 читает из *p и пишет в *oqueue
t1.detach();
t2.detach();
}
1. Введение
В этой статье я попытаюсь исследовать и развенчать пять популярных мифов про C++:
1. Чтобы понять С++, сначала нужно выучить С
2. С++ — это объектно-ориентированный язык программирования
3. В надёжных программах необходима сборка мусора
4. Для достижения эффективности необходимо писать низкоуровневый код
5. С++ подходит только для больших и сложных программ
Если вы или ваши коллеги верите в эти мифы – эта статья для вас. Некоторые мифы правдивы для кого-то, для какой-то задачи в какой-то момент времени. Тем не менее, сегодняшний C++, использующий компиляторы ISO C++ 2011, делает эти утверждения мифами.
Мне они кажутся популярными, потому что я их часто слышу. Иногда их аргументировано доказывают, но чаще используют как аксиомы. Часто их используют, чтобы отмести С++ как один из возможных вариантов решения какой-либо задачи.
Каждому мифу можно посвятить книгу, но я ограничусь простой констатацией и кратким изложением своих аргументов против них.
Читать полностью »
Грязные трюки с макросами C++
2014-12-29 в 7:19, admin, рубрики: c++, c++11, грязные трюки, грязный хак, макросы, препроцессор, Программирование, разработкаВ этой статье я хочу сделать две вещи: рассказать, почему макросы — зло и как с этим бороться, а так же продемонстрировать пару используемых мной макросов C++, которые упрощают работу с кодом и улучшают его читаемость. Трюки, на самом деле, не такие уж и грязные:
- Безопасный вызов метода
- Неиспользуемые переменные
- Превращение в строку
- Запятая в аргументе макроса
- Бесконечный цикл
Заранее предупреждаю: если Вы думаете увидеть под катом что-то крутое, головоломное и сногсшибательное, то ничего такого в статье нет. Статья про светлую сторону макросов.Читать полностью »
Именованные параметры в современном C++
2014-12-24 в 10:08, admin, рубрики: c++, c++11, C++14, named parameters, Блог компании Инфопульс Украина, ПрограммированиеИз Википедии: "Именованные параметры в языках программирования означают поддержку указания явных имен параметров в вызове функции. Вызов функции, принимающей именованные параметры, отличается от обычного вызова функции, в котором передаваемые аргументы ассоциируются с параметрами функции лишь только по их порядку в вызове функции"
Давайте посмотрим на пример:
createArray(10, 20); // Что это значит? Что за "10" ? Что за "20" ?
createArray(length=10, capacity=20); // О, вот теперь понятнее!
createArray(capacity=20, length=10); // И наоборот тоже работает.
И еще один пример на выдуманном псевдо-языке:
window = new Window {
xPosition = 10,
yPosition = 20,
width = 100,
height = 50
};
Этот подход особенно полезен для функций с большим количеством опциональных параметров, при вызове которых нужно изменить лишь некоторую часть дефолтных значений. Некоторые языки программирования поддерживают именованные параметры (C#, Objective-C, ...), но не С++. В этом посте мы рассмотрим пару классических способов эмуляции именованных параметров в С++, ну и попробуем придумать что-то новое.
Читать полностью »
Сериализация C++ с полиморфизмом и прототипами
2014-12-08 в 16:13, admin, рубрики: c++, c++11, КодоБред, полиморфизм, Программирование, сериализацияУже достаточно давно заинтересовался темой сериализации, а если конкретно, то сериализацией объектов, хранящихся по указателю на базовый класс. Например, если мы хотим загружать интерфейс приложения из файла, то скорее всего нам придется заполнять полиморфными объектами контейнер по типу “std::vector<iWidget*>”. Возникает вопрос, как подобное реализовать. Этим я недавно решил заняться и вот что получилось.
Для начала я предположил, что нам все-таки придется унаследовать в базовом классе интерфейс iSerializable, такого вида:
class iSerializable
{
public:
virtual void serialize (Node node) = 0;
};
Как любому C++ разработчику, следящему за новинками в отрасли и стандартами в частности, мне стало интересно, насколько полно вообще поддерживается стандарт C++ 11 (а также 1y и 1z) разными компиляторами? Да, существуют разные сводные таблицы, но чаще всего это сравнение двух компиляторов или двух версий одного компилятора, либо сводная таблица, но уже устаревшая, либо вообще неполный список. В общем, сел я да и сделал полную таблицу (на основе списка Clang-a и GCC) по четырем компиляторам: Clang, GNU C++, MSVC и Intel C++.Читать полностью »