61
Qt. Как выжить на минном поле. Советы саперу Денис Кормалев Нижний Новгород, 2014

Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

  • Upload
    yandex

  • View
    1.224

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Qt. Как выжить на минном поле.

Советы саперу

Денис Кормалев

Нижний Новгород, 2014

Page 2: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру
Page 3: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::parent()

● parent() - великая вещь и крайне удобна

Page 4: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::parent()

● parent() - великая вещь и крайне удобна● НО, бывает что сильно замедляет скорость

выполнения

Page 5: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::parent()

● parent() - великая вещь и крайне удобна● НО, бывает что сильно замедляет скорость

выполнения● Все дети хранятся в списке, из которого при

удалении - изымаются

Page 6: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::parent()

● parent() - великая вещь и крайне удобна● НО, бывает что сильно замедляет скорость

выполнения● Все дети хранятся в списке, из которого при

удалении - изымаются● Если детей много, то это может существенно

замедлить время удаления

Page 7: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Всегда ли нужны Q_PROPERTY

● Еще один инструмент, который сложно переоценить

Page 8: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Всегда ли нужны Q_PROPERTY

● Еще один инструмент, который сложно переоценить

● С приходом QML стало удобно оборачивать все данные в Q_PROPERTY

Page 9: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Всегда ли нужны Q_PROPERTY

● Еще один инструмент, который сложно переоценить

● С приходом QML стало удобно оборачивать все данные в Q_PROPERTY

● Но иногда легко и недооценить стоимость

Page 10: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Всегда ли нужны Q_PROPERTY

● Еще один инструмент, который сложно переоценить

● С приходом QML стало удобно оборачивать все данные в Q_PROPERTY

● Но иногда легко и недооценить стоимость● В случае большого количества мелких

данных - может сильно ударить по использованию памяти (1.5-2x)

Page 11: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Всегда ли нужны Q_PROPERTY

● Еще один инструмент, который сложно переоценить

● С приходом QML стало удобно оборачивать все данные в Q_PROPERTY

● Но иногда легко и недооценить стоимость● В случае большого количества мелких

данных - может сильно ударить по использованию памяти (1.5-2x)

● Решение - оставить в свойствах только действительно необходимые вещи; перевести на модели

Page 12: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::connect()

● Проектировался с учетом минимальной стоимости использования

Page 13: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::connect()

● Проектировался с учетом минимальной стоимости использования

● Но минимум не значит 0

Page 14: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::connect()

● Проектировался с учетом минимальной стоимости использования

● Но минимум не значит 0● Если есть

– много мелких дата-объектов, каждый из которых сообщает об изменениях нескольких полей

– одно общее место, куда это все в итоге приходит (например dataChanged модели)

Page 15: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject::connect()

● Проектировался с учетом минимальной стоимости использования

● Но минимум не значит 0● Если есть

– много мелких дата-объектов, каждый из которых сообщает об изменениях нескольких полей

– одно общее место, куда это все в итоге приходит (например dataChanged модели)

● то стоит рассмотреть возможность сделать один сигнал и в дата-объектах

Page 16: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject - надо ли?

● Очень часто люди не задумываются и наследуют все классы от QObject

Page 17: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject - надо ли?

● Очень часто люди не задумываются и наследуют все классы от QObject

● Это удобно и просто

Page 18: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject - надо ли?

● Очень часто люди не задумываются и наследуют все классы от QObject

● Это удобно и просто● Это может сильно сказаться на

использовании памяти и процессорного времени

Page 19: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QObject - надо ли?

● Очень часто люди не задумываются и наследуют все классы от QObject

● Это удобно и просто● Это может сильно сказаться на

использовании памяти и процессорного времени

● Иногда класс это просто класс, QObject не является обязательным предком

Page 20: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Foreach или for

Page 21: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Foreach или for

● Foreach - макрос для упрощенного прохода по контейнеру

Page 22: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Foreach или for

● Foreach - макрос для упрощенного прохода по контейнеру

● For - в похожем виде появился в C++11

Page 23: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Foreach или for

● Foreach - макрос для упрощенного прохода по контейнеру

● For - в похожем виде появился в C++11● Но они не идентичны и заменить один

другим - нельзя

Page 24: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Foreach или for

● Foreach - макрос для упрощенного прохода по контейнеру

● For - в похожем виде появился в C++11● Но они не идентичны и заменить один

другим - нельзя● Foreach - копирует контейнер

Page 25: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Foreach или for

● Foreach - макрос для упрощенного прохода по контейнеру

● For - в похожем виде появился в C++11● Но они не идентичны и заменить один

другим - нельзя● Foreach - копирует контейнер● For - не копирует

Page 26: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Лямбды в качестве слотов

● Когда только появилась возможность использования лямбд в качестве слотов - было множество проблем связанных с тем, где выполняется слот, кто отвечает за его удаление и т. д.

Page 27: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Лямбды в качестве слотов

● Когда только появилась возможность использования лямбд в качестве слотов - было множество проблем связанных с тем, где выполняется слот, кто отвечает за его удаление и т. д.

● Сейчас есть доп. параметр - context

Page 28: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Лямбды в качестве слотов

● Когда только появилась возможность использования лямбд в качестве слотов - было множество проблем связанных с тем, где выполняется слот, кто отвечает за его удаление и т. д.

● Сейчас есть доп. параметр - context● Context это QObject, в потоке которого будет

выполнена лямбда, и при удалении которого будет удалена лямбда (и подключение)

Page 29: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

invokeMethod

● invokeMethod обычно используется, когда нужно вызвать метод в потоке, к которому принадлежит его объект, а делать лишний сигнал неохота

Page 30: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

invokeMethod

● invokeMethod обычно используется, когда нужно вызвать метод в потоке, к которому принадлежит его объект, а делать лишний сигнал неохота

● Но в отличие от сигналов - можно вернуть значение через BlockingQueuedConnection

Page 31: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

invokeMethod

● invokeMethod обычно используется, когда нужно вызвать метод в потоке, к которому принадлежит его объект, а делать лишний сигнал неохота

● Но в отличие от сигналов - можно вернуть значение через BlockingQueuedConnection

● Главное - помнить что это работает только с разными потоками

Page 32: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

PIMPL

● Широко известный паттерн

Page 33: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

PIMPL

● Широко известный паттерн● Применяется в Qt для поддержки

совместимости ABI

Page 34: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

PIMPL

● Широко известный паттерн● Применяется в Qt для поддержки

совместимости ABI● Но в приложениях может быть полезна для

сокрытия асинхронной природы класса

Page 35: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

PIMPL

● Широко известный паттерн● Применяется в Qt для поддержки

совместимости ABI● Но в приложениях может быть полезна для

сокрытия асинхронной природы класса● Приватный класс работает в другом потоке

Page 36: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

PIMPL

● Широко известный паттерн● Применяется в Qt для поддержки

совместимости ABI● Но в приложениях может быть полезна для

сокрытия асинхронной природы класса● Приватный класс работает в другом потоке● Публичный класс - делает только

invokeMethod

Page 37: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

PIMPL

● Широко известный паттерн● Применяется в Qt для поддержки

совместимости ABI● Но в приложениях может быть полезна для

сокрытия асинхронной природы класса● Приватный класс работает в другом потоке● Публичный класс - делает только

invokeMethod● Результат возвращается через сигналы

Page 38: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML и потоки

● При переходе на v8/v4min появилась оптимизация, которая может привести к перепроектированию большой части приложения

Page 39: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML и потоки

● При переходе на v8/v4min появилась оптимизация, которая может привести к перепроектированию большой части приложения

● QML может подключиться только к сигналу, который испущен из объекта, принадлежащего GUI-потоку

Page 40: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML и потоки

● При переходе на v8/v4min появилась оптимизация, которая может привести к перепроектированию большой части приложения

● QML может подключиться только к сигналу, который испущен из объекта, принадлежащего GUI-потоку

● Возможные решения:– moveToThread

Page 41: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML и потоки

● При переходе на v8/v4min появилась оптимизация, которая может привести к перепроектированию большой части приложения

● QML может подключиться только к сигналу, который испущен из объекта, принадлежащего GUI-потоку

● Возможные решения:– moveToThread

– работа через модели, а не через сырые объекты

Page 42: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML и потоки

● При переходе на v8/v4min появилась оптимизация, которая может привести к перепроектированию большой части приложения

● QML может подключиться только к сигналу, который испущен из объекта, принадлежащего GUI-потоку

● Возможные решения:– moveToThread

– работа через модели, а не через сырые объекты

– классы-обертки в GUI-потоке

Page 43: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● QML относительно молодая технология

Page 44: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● QML относительно молодая технология● До сих пор нет четко сформированных best

practices

Page 45: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● QML относительно молодая технология● До сих пор нет четко сформированных best

practices● Очень часто люди впадают в две крайности:

Page 46: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● QML относительно молодая технология● До сих пор нет четко сформированных best

practices● Очень часто люди впадают в две крайности:

– QML как язык разметки

Page 47: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● QML относительно молодая технология● До сих пор нет четко сформированных best

practices● Очень часто люди впадают в две крайности:

– QML как язык разметки

– QML как основа приложения

Page 48: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как язык разметки

● Крайность, когда QML расценивается как замена xml в .ui-файлах

Page 49: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как язык разметки

● Крайность, когда QML расценивается как замена xml в .ui-файлах

● Как следствие активная работа с qml из C++:– множество objectName, по которым идет поиск

Page 50: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как язык разметки

● Крайность, когда QML расценивается как замена xml в .ui-файлах

● Как следствие активная работа с qml из C++:– множество objectName, по которым идет поиск

– обращение к элементам через индекс в списке детей

Page 51: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как язык разметки

● Крайность, когда QML расценивается как замена xml в .ui-файлах

● Как следствие активная работа с qml из C++:– множество objectName, по которым идет поиск

– обращение к элементам через индекс в списке детей

● Одно небольшое изменение в QML может привести к паре дней работы по изменению кода

Page 52: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как основа приложения

● Крайность, когда QML расценивается как святой Грааль и вся бизнес-логика пишется на QML

Page 53: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как основа приложения

● Крайность, когда QML расценивается как святой Грааль и вся бизнес-логика пишется на QML

● C++ в данном случае идет как оболочка для запуска QML и выполнение задач, нереализуемых на QML (общение с железом и подобное)

Page 54: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как основа приложения

● Крайность, когда QML расценивается как святой Грааль и вся бизнес-логика пишется на QML

● C++ в данном случае идет как оболочка для запуска QML и выполнение задач, нереализуемых на QML (общение с железом и подобное)

● Этот подход чреват:– медленной скоростью работы

Page 55: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

QML как основа приложения

● Крайность, когда QML расценивается как святой Грааль и вся бизнес-логика пишется на QML

● C++ в данном случае идет как оболочка для запуска QML и выполнение задач, нереализуемых на QML (общение с железом и подобное)

● Этот подход чреват:– медленной скоростью работы

– высокой сложностью изменения бизнес-логики

Page 56: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● Очень важно соблюсти баланс между этими крайностями

Page 57: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● Очень важно соблюсти баланс между этими крайностями

● Бывают ситуации когда один из этих подходов оправдан, но это 1%

Page 58: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● Очень важно соблюсти баланс между этими крайностями

● Бывают ситуации когда один из этих подходов оправдан, но это 1%

● В большинстве случаев стоит расценивать QML как средство GUI и всю логику, непосредственно связанную с GUI оставлять там

Page 59: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● Очень важно соблюсти баланс между этими крайностями

● Бывают ситуации когда один из этих подходов оправдан, но это 1%

● В большинстве случаев стоит расценивать QML как средство GUI и всю логику, непосредственно связанную с GUI оставлять там

● Выносить всю бизнес-логику и серьезную обработку данных в C++

Page 60: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Баланс QML/C++

● Очень важно соблюсти баланс между этими крайностями

● Бывают ситуации когда один из этих подходов оправдан, но это 1%

● В большинстве случаев стоит расценивать QML как средство GUI и всю логику, непосредственно связанную с GUI оставлять там

● Выносить всю бизнес-логику и серьезную обработку данных в C++

● Инициировать диалог QML/C++ должна сторона QML

Page 61: Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру

Вопросы?

[email protected][email protected]