crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику Iron Bug ::: Спасибо сказали: 219 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
20.11.2013, 15:44 Сборка boost с MSVS 2013
В общем, я тут сделала патч для сборки boost 1.54.0 под MSVS 2013:
https://sourceforge.net/p/ironbugscollectio...nk/boost_patch/

Вдруг кому пригодится.

Пока я ковырялась, тут уже успел выйти boost 1.55.0. Я думаю, что для него патч тоже подойдёт, ибо файлы сборки по версиям меняются редко.
Но это надо будет проверить.
Возможно, какие-то отдельные библиотеки недопатчились. Я пока проверила те, с которыми я работаю - всё работает. И собирается без проблем. Если возникнут проблемы - сообщайте.
AD, Litkevich Yuriy,
24.10.2013, 0:31 std::shared_ptr и лямбда функции
Цитата(alexy @ 24.10.2013, 2:29) *
в твоем коде указатель используется прямо на месте, то есть любой умный указатель в принцепе подойтед. функция go завершит исполнение и объект уничтожится..

никто тебе не запрещает передавать объект в go() извне, а внутри передавать его дальше. я просто привела простой пример.
go() там, кстати, только для демонстрации использования this в лямбда-функциях (у тебя он зачем-то прилеплен в вызовах).

если в этот пример подставить shared_ptr, то он будет потокобезопасный и у него может быть сколько угодно копий. я просто думала, что у тебя вызовы последовательно используют объект.
Внимание! "потокобезопасность" shared_ptr - это лишь безопасность обращений к самому указателю: безопасный счётчик ссылок и вызов деструктора объекта. сам объект, на который он указывает, не защищён. и если в разных потоках происходит изменение этого объекта, то надо ставить мьютексы или ещё какие-то средства синхронизации для обращения к памяти.

В случае простой передачи данных (функции thread_func - просто заглушки в том месте, где нужно вызвать создание потока):
#include <iostream>
#include <memory>

using namespace std;

class foo
{
    // какой-то класс
public:
    ~foo() { cout << "Good bye, C++11" << endl; }  // деструктор, вызывается автоматически при удалении shared_ptr
    foo() { cout << "Hello, C++11!" << endl; }   // конструктор
    string say_hello() { return "Hello!"; }
};

void thread_func(const shared_ptr<foo> pfoo,std::function<string (const shared_ptr<foo> pfoo)>f)
{
    // здесь можно создать поток и передать в него параметры, а потом их как-то вызвать
    cout << f(pfoo) << endl;
}

int main()
{
    const shared_ptr<foo> pfoo(new foo());
    thread_func(pfoo,[&pfoo](const shared_ptr<foo> pfoo)->string { return string("Func1: ") + pfoo->say_hello(); });
    thread_func(pfoo,[&pfoo](const shared_ptr<foo> pfoo)->string { return string("Func2: ") + pfoo->say_hello(); });
    return 0;
}


Вот реализация с бустовскими потоками (проверено, это работает):
Раскрывающийся текст
#include <iostream>
#include <memory>
#include <boost/thread.hpp>

using namespace std;
using namespace boost;

class foo
{
    // какой-то класс
public:
    ~foo() { cout << "Good bye, C++11" << endl; }  // деструктор, вызывается автоматически при удалении shared_ptr
    foo() { cout << "Hello, C++11!" << endl; } // конструктор
    string say_hello() { return "Hello!"; }
};

void thread_func(int delay,const std::shared_ptr<foo> pfoo,std::function<string (const std::shared_ptr<foo> pfoo)>f)
{
    this_thread::sleep(posix_time::milliseconds(delay)); // создаём вид бурной деятельности - спим! :)
    cout << f(pfoo) << endl; // вызываем нашу лямбду с объектом
}

thread *pthrd1;
thread *pthrd2;

void main_thread()
{
    const std::shared_ptr<foo> pfoo(new foo());
    pthrd1 = new thread(thread_func,3000,pfoo,[&pfoo](const std::shared_ptr<foo> pfoo)->string { return string("Func1: ") + pfoo->say_hello(); });  // этот поток будет выполняться 3 секунды
    pthrd2 = new thread(thread_func,5000,pfoo,[&pfoo](const std::shared_ptr<foo> pfoo)->string { return string("Func2: ") + pfoo->say_hello(); });  // этот поток будет выполняться 5 секунд
}

int main()
{
    thread main_thrd(main_thread);
    main_thrd.join();
    cout << "Main thread finished!" << endl;

    pthrd1->join();
    pthrd2->join();
    return 0;
}
alexy,
23.10.2013, 18:36 DCTerminal - Моя первая Qt-программа
Цитата(DruidCat @ 23.10.2013, 15:54) *
Если кто увидит проблемные места (корявый код) в программе, пожалуйста отпишитесь. Я из тех людей, кто любит учиться и для меня чужой опыт очень ценен.

Ну, лучше этот пост вынести в отдельную тему - ибо он уже не относится к QtSerialPort (это к модераторам).
А так, по коду: очень много конструкций вида
if ( some_string == "some_value" )

лучше сделать через else if
if(...) {...} 
else if(...) {...}
else if(...) {...}
else {...}

чтобы не проверялись все условия для одной строки: если одно совпало, другие уже не совпадут. сравнение строк - очень медленная операция. в данном случае это единичные вызовы, но в более серьёзной программе такие if-ы сожрут процессор.

а что касается открытия порта с зависанием, то вот тут, в ответе, человек очень подробно исследовал данную проблему и пришёл к выводу, что сначала надо открыть порт, а потом уже выставлять все его параметры. это бага (или фича) QSerialPort.
DruidCat,
23.10.2013, 17:28 QTextBrowser. Не открывается html в релизе.
судя по инфе в гугле, это баг:
https://bugreports.qt-project.org/browse/QTBUG-24077
решается только использованием полных путей.
alexei-evil,
17.10.2013, 20:41 Копирование и восстановление БД Firebird в Qt
изобретать велосипеды с бэкапом не рекомендую. если есть утилька из командной строки, то лучше программно вызывать её.
ибо бэкап - это не просто архивирование, а ещё проверка на целостность и вообще он делается при стабильном состоянии базы, когда к ней нет коннектов. чаще всего юзер не парится с бэкапами, это задача админа. но если база мелкая и чисто юзерская, то можно просто вызывать бэкап утилькой.

в БД важно не количество, а качество :) для юзера и одна запись может иметь некую информационную ценность. поэтому такие вещи либо выносятся в конфиг, либо передаются в ручное управление юзера: когда захотел, тогда и забэкапил.
Steklova Olga,
17.10.2013, 10:07 Boost + ICU
Собрала тут в очередной раз комплект boost+ICU. На этот раз boost 1.54.0 и ICU 52.1.

Собрано было для MSVC и MinGW под вендой и GCC под линём.

Для сборки в MSVC под вендой:
ICU собирается в студии, открыванием солюшена icu/source/allinone/allinone.sln и полной сборкой релиза.
Далее, для сборки boost запускается Bootstrap.bat (он компилирует bjam.exe).
И далее, в консоли венды запускается следующий батничек:
bjam --toolset=msvc-10.0 --build-dir="<каталог_для_временных_файлов_сборки>" address-model=32 threading=multi link=static runtime-link=static -sHAVE_ICU=1 -sICU_PATH="<путь_до_корня_ICU_сорца>" -sICU_LINK="/LIBPATH:<путь_до_корня_ICU_сорца>/lib icuuc.lib icuin.lib icudt.lib" 
bjam --toolset=msvc-10.0 --build-dir="<каталог_для_временных_файлов_сборки>" address-model=32 threading=multi link=static runtime-link=shared -sHAVE_ICU=1 -sICU_PATH="<путь_до_корня_ICU_сорца>" -sICU_LINK="/LIBPATH:<путь_до_корня_ICU_сорца>/lib icuuc.lib icuin.lib icudt.lib"

Тут сборка идёт под 10-й студией, для 32-битной системы, многопоточные сборки со статической линковкой и разными линковками runtime библиотек.
Если добавить в обе строки
cflags="/DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG"

то будет сборка boost::thread с наносекундными таймерами.

Для MinGW под вендой:
ICU собирается в MSys:
./configure --prefix=<какая-нить отдельная папка>

Инсталляция в отдельную папку нужна для последующего копирования файлов для работы в венде. Потом стандартно: make+make install. Забираем все файлы из папки, куда установилось, и копируем в удобное для себя место для хранения собранной ICU.
Далее, собираем boost (из консоли венды):
Bootstrap.bat (для собирания bjam, неважно, каким компилятором).
Далее, батничек:
bjam --toolset=gcc --build-dir="<каталог_для_временных_файлов_сборки>"  threading=multi link=static runtime-link=shared address-model=32 cflags="-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG" -sHAVE_ICU=1 -sICU_PATH="<путь_до_копии собранного_ICU>" -sICU_LINK="-L<путь_до_копии собранного_ICU>/lib -licuuc -licuin -licudt"

-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG означает сборку boost::thread с наносекундными таймерами. Это можно опустить или добавить, по желанию. Я собираю с таймерами, ибо они мне нужны.

Для запуска GCC нужно, чтобы в переменной окружения PATH был прописан путь до MinGW/bin.

Также везде в опции bjam можно добавить -j2 для сборки на двух ядрах проца, например. Чтобы было быстрее.

Собирается долго, жрёт много памяти и винта в каталоге для временных файлов. Можно указать конкретные библиотеки для сборки или исключить некоторые, по желанию.

Под линюксом, с GCC:
ICU собирается стандартно (configure+make+make install). Если нужен нестандарный каталог, то с prefix.
Сборка boost:
Если ICU установлен в нестандартный каталог, то указать, где:
bootstrap.sh --with-icu=<путь_до_установки_ICU>

Либо просто без параметров, если ICU установлен в общие каталоги.
Далее, скрипт:
bjam threading=multi link=shared runtime-link=shared -d2 --without-python --without-mpi --layout=tagged -sHAVE_ICU=1 -sICU_PATH=<путь_до_установки_ICU> -sICU_LINK="-L<путь_до_установки_ICU>/lib -licuuc -licudata" cxxflags="-I<путь_до_установки_ICU>/include" stage

Собственно, параметры ICU_PATH и cxxflags тут нужны только если ICU был установлен в нестандартный каталог (с prefix).
Ну и выбор дополнительных флагов можно добавить, по желанию. Например,
cflags="-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG"
или список библиотек, которые нужны, или -j2 для ускорения. Ну и разные параметры линковки, разумеется.
leonneon_89,
15.10.2013, 7:40 boost::interprocess
заметь, что interprocess - это не работа между потоками, это работа между процессами. это общая память между приложениями, в которой создаются мьютексы, буферы памяти для обмена и прочие общие объекты. а для синхронизации потоков внутри процесса используются обычные мьютексы boost::thread::mutex.

с областями видимости ("создали переменную - заблокировано") работают scoped мьютексы.
на практике это выглядит так:

#include <boost/thread.hpp>

using namespace boost;

// где-то снаружи обоих потоков объявлен мьютекс
mutex some_mutex;
...

{
// некая область видимости
...
// здесь мьютекс не объявлен и не залочен
...
mutex::scoped_lock lock(some_mutex);
// здесь мьютекс залочен
}

// здесь (снаружи области видимости) мьютекс сброшен

это общий принцип работы с бустовскими мьютексами. вообще, про мьютексы и синхронизацию читать тут.

общее описание различных видов lock'ов детально объяснено в Lock concepts
alexy,
1.10.2013, 17:06 UdpSocket
во-первых, UDP не гарантирует доставки сообщения.
во-вторых, при 1 сообщении в миллисекунду получится 1000 сообщений в секунду. каков размер сообщения? посчитай, хватит ли скорости твоей сети для прокачки такого траффика?
ну и любые операции ввода-вывода с потоками очень тормозные и нельзя их запихивать в обработку сообщений. можно буферизовать сообщения, а в отдельном потоке их разбирать.

ну и ещё: и генератор, и приёмник должны запускаться с очень высоким приоритетом.
leonneon_89,
1.10.2013, 16:56 QProcess не работает из-за strcat
дык, тут сразу две ошибки памяти. во-первых, перетирать строки, возвращённые getenv, нельзя. если хочешь оперировать с этими данными, копируй в свой локальный буфер. во-вторых, strcat не занимается перераспределением памяти и у строки в первом параметре должно хватить длины на всё содержимое, с присоединённым хвостом.
mva,
24.8.2013, 23:49 dynamic_cast Segmetation fault
добавь оператор присваивания:
template <typename T>
    Any& operator = (const T& tValue)
    {
        m_adValue = new TemplateData<T>(tValue);
    }


но!!! тут вместо new и delete нужно использовать умные указатели, иначе будет утечка памяти. ну либо сделать какой-то метод принудительной очистки типа

void clear()
    {
        if(m_adValue != NULL) {
            delete m_adValue;
            m_adValue = NULL;
       }      
   }


и использовать его после работы с каждым типом, например:
        
        Any an = 12.4;
    double d = an;
    an.clear();
    an = QPoint(10,20);
    QPoint a = an;
    an.clear();


P.S. вообще, это простое следствие Правила Большой Тройки. часто если его не соблюдают, получают такие ошибки.
Count0,
23.8.2013, 14:41 libusb_device_handle to HANDLE
никак. разработчики декларируют libusb_device_handle как непрозрачную для юзера структуру. если разработчики решили не давать ссылок на структуру объекта, значит, это не предусмотрено. теоретически, можно выкопать определение из сорцов, но это неправильный подход, чреватый ошибками работы с железом.
а зачем понадобился HANDLE?
laa88rf,
23.8.2013, 12:49 Непонятная проблема при компиляции релиза
на самом деле, в данном случае inline всё равно работать не будет, потому что есть возвращаемое значение и return. подробно ограничения на inline описаны, например, здесь. ограничений довольно много.
но если уж очень хочется оптимизировать вызовы, то можно использовать т.н. оптимизацию при линковке (link-time optimization). в более-менее свежих компиляторах она поддерживается. например, в msvc это опция /LTCG, в gcc это опция -flto. собственно, это "inline" на уровне линковщика. подробнее можно почитать тут.
ilyabvt,
31.7.2013, 22:14 Несколько вопросов от новичка
ig4icd32.dll - это акселератор видеокарты от интел для лаптопов. возможно, надо обновить драйверы материнки или видеокарты.
посмотри тут:
http://www.intel.com/support/graphics/sb/CS-031461.htm
MishaUA,
12.7.2013, 13:27 Web/JavaScript: зачем внутри HTML-коментарий
некоторые браузеры не понимают скриптов и это сделано, чтобы они не мешали загрузке страницы в таких браузерах.
на практике такие браузеры не встречаются, поэтому в примерах особо никто не парится.
AD, Litkevich Yuriy,
10.7.2013, 6:11 Доступ из настольного ПО к БД на сервере через PHP Litkevich Yuriy,
4.7.2013, 18:42 Объясните пожалуйста паттерн фабрика
в книге приведена схема классов в UML-формате (я только что проверила книгу в онлайн). если хочешь читать книги по паттернам проектирования, изучи для начала основы схем UML для объектно-ориентированного программирования, это всегда пригодится. там нет ничего сложного, просто обозначения на схеме имеют вполне конкретные значения, которые надо знать. иначе тебе придётся постоянно задавать много вопросов.
1. да, это наследование. на схеме это указано явно.
2. обычно фабрика используется другими классами и они знают, с чем имеют дело.
3. по паттернам проектирования есть очень много книг и сайтов. и даже тут форумчане пытались создать некое подобие примеров для паттернов: http://www.wiki.crossplatform.ru/index.php/Design_Patterns
FakeMoNEy,
30.3.2013, 0:16 IDEA+Apache+Tomcat JSP не работает сервлет
я не спец в жабе, но сервер не может найти твой класс. возможно, его нужно положить в папку, которая будет соответствовать странному имени com.example.web.BeerSelect. а уж как это реализуется под конкретной системой - это надо доки читать. что-нибудь типа WEB-INF/classes/com/example/web/BeerSelect и в этой папке должен лежать файл с классом.
Toisen,
27.3.2013, 19:37 Архитектурный вопрос
Цитата(lanz @ 27.3.2013, 17:43) *
Как кстати насчет Dbus/COM, ни у кого не было опыта использования?

c COM одно время дело имела - это было наследние тех, кто писал проект до меня. не понравилось просто ужасно. может, на С# или каком-нить вижуал бейсике это выглядит проще, но на С++ под него писать очень сложно, особенно если ты не потребитель ресурсов, а сам что-то предоставляешь. потом, регистрация объекта - дело довольно геморное. юзать COM можно, но удовольствия это не доставляет.
мне вообще кажется, что последние годы мелкософт хочет отойти от COM и "неуправляемых" (native) приложений. я даже подозреваю их в том, что они из-за этого не хотят развивать и поддерживать компилятор С++. может, это паранойя, но как-то так это выглядит.
lanz,
26.3.2013, 22:43 Архитектурный вопрос
Вот, по-быстрому написала, как в С++11 это сделать можно.
Это без Qt(я её не юзаю), но не суть. Можно любые классы и контейнеры использовать, это не принципиально.
У меня заюзан простой map и функция, принимающая int, для примера.
В GCC компилируется с опцией -std=c++11.
Раскрывающийся текст
#include <map>
#include <string>
#include <stdio.h>
#include <functional>

using namespace std;

class Base
{
public:
        typedef std::function<void(int d)> CommandProc;
        typedef map<string,CommandProc> map_type;

protected:
        map_type processors;
public:
        Base() {
                processors.insert(map_type::value_type("BaseCommand",std::bind(&Base::BaseCommand, this, std::placeholders::_1)));

        }
        void Command (string str, int value) {
                map_type::iterator iter = processors.find(str);
                if(iter != processors.end())
                        (iter->second)(value);
        };
protected:
        void BaseCommand(int value) {
                printf("this is Base::BaseCommand with argument %d\n",value);
        }
};

class Child1 : public Base
{
protected:
        void MyCommand(int value) {
                printf("this is Child1::MyCommand with argument %d\n",value);
        }
public:
        Child1() {
                processors.insert(map_type::value_type("MyCommand",std::bind(&Child1::MyCommand, this, std::placeholders::_1)));
        }
};

class Child2 : public Base
{
protected:
        void MyCommand(int value) {
                printf("this is Child2::MyCommand with argument %d\n",value);
        }
public:
        Child2() {
                processors.insert(map_type::value_type("MyCommand",std::bind(&Child2::MyCommand, this, std::placeholders::_1)));

        }
};


int main(int argc, char* argv[])
{
        Child1 test1;
        test1.Command("BaseCommand",10);
        test1.Command("MyCommand",10);
        Child2 test2;
        test2.Command("BaseCommand",20);
        test2.Command("MyCommand",20);
}
lanz,
24.2.2013, 19:01 Проблема с svn
удалились не файлы репозитория, а их копии. собственно, удаление копии никак не влияет на репозиторий, если явно не указать, что надо удалить и в репозитории. любые команды по удалению и перемещению файлов в репозитории никак не связаны с локальными копиями. некоторые графические утилиты позволяют сразу удалять из репозитория файлы, которые юзер удалил в копии. но это не встроенная фича контроля версий. это нужно отдельно удалять через svn delete и потом коммитить.
Miha31,
28.1.2013, 18:17 freopen()
дык, это обычный варнинг мелкософта. они наплодили несовместимых ни с кем функций и теперь их пиарят таким образом.
если собираешься юзать кроссплатформу, то эти fooo_s функции не совместимы ни с одним стандартом. так что либо писать кучу ifdef'ов, либо просто забить на это.
Artem,
26.1.2013, 12:32 Помогите с регулярным выражением.
Цитата(Litkevich Yuriy @ 26.1.2013, 6:45) *
Цитата(Razerio @ 26.1.2013, 0:55) *
кроме тех, что находятся между "<a" и "</a>".
это кость в горле Регулярных выражений, с помощью них невозможно отслеживать "парные скобки", т.е. элементы играющие их роль

возможно, это кость в горле конкретной реализации. я спокойно распарсиваю такие выражения в boost, ANTLR, в обычном перле. в целом, у регекспов такого ограничения нет. это рекурсивные операции.
Razerio,
17.1.2013, 12:58 Проблема Eclipse + static lib + namespace
заголовочник не включил.
Xcuh,
27.12.2012, 13:59 Вопросы по основам PHP
Цитата(Litkevich Yuriy @ 27.12.2012, 11:08) *
да?

именно. и получается она из пути до имени файла. я внизу дописала, что это файл model/setting/setting.php. а в нём определён этот самый editSetting

Цитата(Litkevich Yuriy @ 27.12.2012, 11:08) *
Может ты мне сможешь объяснить, как такие вещи разыскивать?

с этим сложнее. начинаешь смотреть с класса, с загрузки этого конкретного скрипта. проблема в том, что в PHP могут include'иться любые файлы и они становятся частью кода. а классы на самом деле не совсем классы, они могут расширяться "на ходу". по сути, это именованные массивы. поэтому надо проверять всю цепочку загрузки до конкретного класса, чтобы понять, что туда попадает, в итоге.
я сначала смотрела исходный класс, потом Control, потом - Model. собственно, я вряд ли смогу формально изложить ход своих мыслей при исследовании этого вопроса. просто я поняла, как эта машина работает и тогда сразу нашла, где примерно собираются эти пути. тут чисто опыт программирования на PHP, наверное.
Litkevich Yuriy,
26.12.2012, 21:27 Вопросы по основам PHP
я нашла код этого OpenCart в сети. это динамически создаваемый член класса (я же говорю, что это не классы нифига, а, скорее, массивы. раньше они и были массивами, по типу javascript, а потом их стали делать более похожими на классы).
в общем, это динамический элемент, грузится он в функции
     public function model($model) {
        $file  = DIR_APPLICATION . 'model/' . $model . '.php';
        $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $model);
        
        if (file_exists($file)) {
            include_once($file);
            
            $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry));
        } else {
            exit('Error: Could not load model ' . $model . '!');
        }
    }

в файле system/engine/loader.php.
конкретно тут он грузит какие-то файлы настроек из каталога model/$model.php, а уж что там в вызове за $model - это надо смотреть на месте.

в случае model_setting_setting это, скорее всего, файл model/setting/setting.php. там вызов editSetting - запрос к базе.
Litkevich Yuriy,

8 страниц V  < 1 2 3 4 5 > » 
RSS Текстовая версия Сейчас: 19.4.2024, 17:05