Показаны сообщения с ярлыком threading. Показать все сообщения
Показаны сообщения с ярлыком threading. Показать все сообщения

четверг, 5 января 2012 г.

Крайне полезные статьи

Приведу список отличных статей, которые очень сильно помогли мне:

Перевод статьи про d-указатели (aka pimpl, чеширский кот и т.п.). Рассказано, что такое д-указатели, зачем они нужны, как их использование помогает соблюдению бинарной совместимости, как увеличивается производительность при перемещении pimpl-объектов и многое другое. Попутно рассказывается, что такое бинарная совместимость вообще, зачем она нужна и для чего в программах на C++ крайне важно в целях бинарной совместимости все детали реализации писать в cpp-файлах, оставляя в h-файлах только самый необходимый минимум объявлений.
Использование dll в Visual C++. Рассказывается, как подключать dll-библиотеки к программе. Рассматривается три способа использования библиотек: явное подключение, неявное подключение (с использованием lib-файлов) и отложенное подключение библиотек. Описывается, что такое lib-файл и для чего он нужен. Описываются особенности использования библиотечных классов, переменных и функций.
Threading without headache. Описывается, как в Qt писать многопоточные приложения без использования таких базовых примитивов, как, например, мьютексы. Если кто не читал - обязательно прочитать. Я был так впечатлен, что тут же за пару дней переделал свой проект, полностью убрав из него мьютексы. Все вызовы методов интерфейсов заменил механизмом сигналов и слотов. Можно сказать, что я вообще абстрагировался от того факта, что приложение многопоточное- за меня все делает великолепный фреймворк Qt. Описывается, зачем нужна функция moveToThread(). Также советую почитать дополнительно про отправку/прием событий QEvent - иногда вместо механизма сигналов и слотов может быть удобнее использовать сообщения. Еще советую почитать это
Виртуальное наследование. В моей практике еще не попадался случай, когда в этом бы возникла необходимость. Вообще довольно сложно представить такой случай, если честно. Но на собеседованиях этот вопрос почти всегда задают, так что читать в обязательном порядке.
Подсчет количества битов в числе. Тут описан наиболее шаманский способ "магических чисел". Остальные способы (последовательный сдвиг и предварительный подсчет) слишком тривиальны, чтобы давать по ним ссылки.
Статья про boost::bind. Большая и полезная для понимания внутреннего устройства буста статья.

вторник, 9 февраля 2010 г.

Swing и многопоточность

Для прорисовки интерфейса в Java с помощью библиотеки swing лучше пользоваться, например, SwingUtilities.invokeLater(Runnable r), а не обычно создавать поток и запускать в нем Runnable. В противном случае будут лезть непонятные ошибки типа JTable Exception in thread "AWT-EventQueue-0" (ArrayIndexOutOfBoundsEx...) или подобные. Это происходит потому, что обращаться к swing-компонентам можно только из потока Event Dispatch Thread (EDT). Функцияция invokeLater ставит задачу в очередь на потоке EDT (т.к. все взаимодействие с swing-овскими графическими элементами управления необходимо осуществавлять только в потоке EDT). Но это не работает в случае, если необходимо выполнить длительный процесс, который заставит ждать поток EDT. Для таких случаев необходимо вместо обычного Thread задействовать SwingWorker.
Очень хорошая русскоязычная статья по этой теме:
http://developers.sun.ru/content/view/159/89/
и еще одна статья (видимо, слегка устаревшая):
http://www.ibm.com/developerworks/ru/edu/j-medswing/section4.html

Очень важно понять, что никаких обращений к swing-компонентам внутри метода SwingWorker.doInBackground() быть не должно т.к. он выполняется в отдельном потоке (не EDT) и если обращаться к swing-компонентам не из EDT потока, то это может стать причиной возникновения исключений. Вывод результатов можно производить, например, в методе SwingWorker.done(), который выполняется в потоке EDT и автоматически вызывается после того, как doInBackground() завершит свою работу, что оберегает нас от возможных проблем.