[Предыдущая: Параллельное программирование] [Поддержка потоков в Qt]
Поддержка потоков в модулях Qt
Потоки и модуль SQL
Соединение может использоваться только внутри создавшего его потока. Перемещение соединений между потоками и создание запросов в другой поток не поддерживается.
Кроме того, используемые драйверами QSqlDriver сторонние библиотеки могут наложить дополнительные ограничения на использование модуля SQL в многопоточной программе. За дополнительной информацией обращайтесь к руководству по клиенту вашей базы данных.
Рисование в потоках
QPainter может быть использован в потоках для рисования на устройствах рисования QImage, QPrinter и QPicture. Рисование на QPixmap и QWidget не поддерживается. В Mac OS X автоматический диалог выполнения не будет отображаться на экране, если вы печатаете за пределами GUI-потока.
Любое количество потоков могут рисовать в любое заданное время, однако в каждый момент времени только один поток может рисовать на заданном устройстве рисования. Другими словами, два потока могут рисовать в один и тот же момент времени, если каждый из них рисует на разных объектах QImage, но два потока не могут одновременно рисовать на одном и том же объекте QImage.
Обратите внимание на то, что в системах X11 без поддержки FontConfig Qt не может отрисовывать текст за пределами ГПИ-потока. Вы можете использовать функцию QFontDatabase::supportsThreadedFontRendering() для определения, может ли быть отрисован шрифт за пределами ГПИ-потока или нет.
Потоки и обработка форматированного текста
Классы QTextDocument, QTextCursor и все родственные классы являются реентерабельными.
Обратите внимание на то, что экземпляр класса QTextDocument, созданный в ГПИ-потоке, может содержать ресурсы изображений QPixmap. Используйте QTextDocument::clone() для создания копии документа и передавайте копию другому потоку для дальнейшей обработки (например, печати).
Потоки и модуль SVG
Классы QSvgGenerator и QSvgRenderer в модуле QtSvg являются реентерабельными.
Потоки и классы с неявным разделением данных
Qt использует оптимизацию, называемую неявным совместным использованием данных для многих своих классов, особенно QImage и QString. Начиная с Qt 4, классы, использующие неявное совместное использование данных, могут быть безопасно скопированы между потоками подобно любым другим классам. Они полностью реентерабельны (reentrant). Неявное совместное использование данных действительно является таковым.
Многие считают, что неявное совместное использование данных и многопоточность - несовместимые концепции из-за способа, которым обычно выполняется подсчет ссылок. Тем не менее, Qt использует атомарный (atomic) подсчет ссылок, чтобы гарантировать целостность совместно используемых данных, избегая потенциальной порчи счетчика ссылок.
Обратите внимание на то, что атомарный подсчет ссылок не гарантирует потокобезопасность. Надо использовать подходящую блокировку при совместном использовании экземпляра класса, неявно разделяемого между потоками. То же требование распространяется на все реентерабельные классы, совместно используемые или нет. Тем не менее, атомарный подсчет ссылок дает гарантию, что поток, работающий в своем собственном, локальном экземпляре неявно разделяемого класса, является безопасным. Мы рекомендуем использовать сигналы и слоты для передачи данных между потоками, поскольку это может быть сделано без необходимости в каких-либо явных (explicit) блокировках.
Резюмируя скажем, что неявно совместно используемые классы в Qt 4 действительно является неявно совместно используемыми. Даже в многопоточных приложениях вы можете безопасно использовать их как если бы они были простыми (plain), не используемыми совместно, реентерабельными классами, основанными на значениях.
[Предыдущая: Параллельное программирование] [Поддержка потоков в Qt]
Авторские права © 2010 Nokia Corporation и/или её дочерние компании |
Торговые марки |
Qt 4.6.4 |
|