середа, 18 вересня 2013 р.

Освоение Qt. Многопоточное программирование

Решил добить тему и научиться программировать с использованием фреймворка Qt. Это позволяет писать современные графические и кроссплатформенные программы на С++ и Qt. Сейчас меня интересует возможность создавать программы под все популярные программные платформы доступные через Qt.

Существуют версии библиотеки для Microsoft Windows, Linux, Android, iOS, Mac OS X, Microsoft Windows CE, QNX, Windows Phone, Haiku и Tizen. То есть если программировать, не задевая какие-то специфичные для ОСи вещи, то можно легко создать приложение под кучу операционок. Одним махом - семерых убивахом. Тем более, что Canonical сделала ставку на Qt в своём Ubuntu SDK для нативных приложений.

Много раз брался за освоение Qt и как-то не складывалось. Развращённый в своё время Delphi и C++Builder'ом, хотелось нормальной IDE для Qt, где можно легко и быстро накидать виджетов и кодить простые GUI программки, а не создавать виджеты из самой программы и кувыркаться с их динамическом размещением на форме.

Qt Creator подружил всё таки меня с Qt. Помня уроки преподавателей кафедры информационных технологий ЗНУ по предмету "Операционные системы", решил все эти уроки воссоздать в Qt. Особенно урок с потоками, что позволяет в современном многоядерном мире ускорить программу и/или сделать интерфейс программы отзывчивым при долгих расчётах в функциях.

Начитался в книгах по Qt про различные способы запуска потоков в Qt: через низкоуровневый QThread, высокоуровневый QtConcurrent и QRunnable. И понял для себя, что если пишешь GUI программы, то, как бы это не звучало парадоксально, но низкоуровневый QThread лучше всех. Примеры, что можно видеть на просторах Интернета, для упрощения и концентрирования внимания на коде потока обычно используют CLI программу, но в GUI мире всё сложнее. При запуске программы уже есть один поток и его называют GUI Thread и только он может обращаться к виджетам и работать с их свойствами. Я хотел как можно более проще и элегантнее передавать функциям значения параметров, взятые из виджетов, и выводить результаты работы тяжёлых функций из потоков в виджеты на форме.

А вот с QtConcurrent не всё так просто. Пример функции, которую якобы асинхронно можно запустить.

extern QString functionReturningAString(QString str)
{
   return str + str;
}
QFuture future = QtConcurrent::run(functionReturningAString, "Hi man ");
QString result = future.result();

Запихать нужную функцию в QtConcurrent::run не сложно, но дождаться ответа через .result() дело другое. result() блокирующая функция, о чём честно предупреждает документация Qt. GUI программы "подвисает" если функция долго выполняется. Для асинхронности нужно использовать Смотрящих в Будущее QFutureWatcher и всё становится не таким простым, как в начале.

В книгах пишут, что QThread даёт всю полноту власти и контроля над потоками, но вроде это иногда - как из пушки по воробьям. Пока решил, что лучше освоить что-то одно и пусть это будет мощный QThread. Он умеет установку приоритетов, паузу и возобновление потоков, принудительное завершение потока и тд и тп.

Пока ради обучения, нашёл уже написанные на языке С решёта для нахождения простых чисел. Алгоритмы запихал как есть и поэтому результаты противоречивые и даже, можно сказать, плачевные. Решето Эратосфена должно быть медленнее, особенно на больших решётах, но мне было не до этого. Нужны были долго работающие функции, как кандидаты на помещения их в свои потоки и всё.

Находим простые числа в потоках

Когда с потоками закончу, хочется с книжкой на перевес попробовать пощупать OpenGL, работу с сетью, базы данных на примере SQLite. А без книжки хочется попробовать написать программу с помощью Ubuntu SDK в Qt Creator. Программа должна одинаково работать и выглядеть в мобильных устройствах с меньшим экраном и на обычном десктопе, как об этом хорошо рассказал Джоно Бэкон в Unity и Единство.

Первую и пока последнюю Scope для линзы Помощи в Dash я ваял в Текстовом редакторе на языке Python. Можно попробовать оценить разработку Scope в Qt Creator, так как там есть шаблон для Scope.

Дополнительные результаты:
Ubuntu SDK и разработка ПО.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments