LINUX.ORG.RU

Не взлетит... Поздно, уже скомпилялось

 


0

2
	Queue::Queue(const Properties& props)
	:	queue_(props.getInteger("Queue.Size"))
	,	worker_(queue_, [ this, &props ]() -> ThreadPoolT::Config 
	
		{ //lambda returns config begin

			ThreadPoolT::Config c = { //config begin
				props.getInteger("Queue.Workers"),
			[ this, &props ](){ //thread task lambda
				boost::this_thread::interruption_point();

				LogCategory* log = Log::instance()->createCategory("Server.Queue");
				try
				{
				DB db;
				db.init("DBWriter", props, log); 

				boost::posix_time::milliseconds delay(props.getInteger("Queue.WriteDelay"));

				while (true)
				{
					boost::this_thread::interruption_point();
					Message* msg;

					while (queue_.dequeue(msg))
					{
							assert(msg && "Queue data seems like inconsistent");
							{
								if (msg->type() == MessageID::E)
								{
									Parser::EMessage& er = *(Parser::EMessage*)msg;

									db.callPreparedStoredProc("CALL p_LoadERepo(?,?,NOW(), ?,?,?,?,?,?,?,?)", 
										er , [ this ] (sql::PreparedStatement& stmt, const Parser::EMessage& er) {
											stmt.setUInt	(1,		er.getExecID());
...
											stmt.setUInt	(11,	t.getSellerIsPrinted());
									});

								}
							}
					}
					LDebug(*log) << "queue is empty, wait for delay";
					boost::this_thread::sleep(delay);
					boost::this_thread::interruption_point();
				}
				}
				catch (const std::exception& e)
				{
					LError(*log) << std::string("Queue initialization error: ").append(e.what());
				}

	},
		[] (boost::thread& t) { //lambda that stopping thread
			t.interrupt();
			t.join();
		}
	}; //config ends here
	return c; }() //call embracing lambda (//lambda returns config end)
	)
{}

========== Build: 2 succeeded, 0 failed, 4 up-to-date, 0 skipped ==========

Два вопроса: «как?» И на*... «почему?»

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Автора убить. Нет, сначала заставить сдать экзамен по английскому, а потом жестоко убить.

tailgunner ★★★★★
()

«C++ - это такой лисп, с пятью разновидностями скобочек» :)

invy ★★★★★
()
Ответ на: комментарий от tailgunner

Я ему передам... Хотя, можно подождать еще кодревью старшими товарищами (первое чувство глядя на комит - «показалось»):)

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Ну я и говорю... Подождать пока старшим товарищам померещится

slackwarrior ★★★★★
() автор топика

Код как код. Только количество уровней вложенности смущает, но надо отдать должное лямбдам.

Chaser_Andrey ★★★★★
()

и да, отбивают отступы табами только муд^W ССЗБ. Поставьте 4 пробела — и оно будет выглядеть намного лучше.

Chaser_Andrey ★★★★★
()

Ого, ещё и так можно.
/me побежал везде делать так же

Gvidon ★★★★
()

Оторвать руки за такую ширину: жир не влезает в окно, и в код добавилась горизонтальная прокрутка!!!

Anon
()

Энжой ёр кресты.

anonymous
()
Ответ на: комментарий от lovesan

Продакшн квалити C++, че. Хотели C++11, с кучей новых фич? Нате, жрите

И ведь сожрут, и еще попросят. У этих людей еще хватает наглости троллить, что при виде лиспа им рябит в глазах от скобочек.

anonymous
()

Вот поэтому придумали Java. Там весь говнокод уже изучен и проименован.

anonymous
()
Ответ на: комментарий от Xenius

Выглядит неожиданно... Местами внезапно. Тейлгуннера подвигает к убийствам человеков (английский не той системы). Мало?

slackwarrior ★★★★★
() автор топика

передай ему, что:

а) он пишет лапшу и не умеет разделять код
б) бустом пользуются только мудаки
в) он не умеет форматировать код

wota ★★
()
Ответ на: комментарий от Anon

А эти ваши плюсы — действительно совершенно непонятная муть!

То есть в том, что какой-то школьник форматирует код табами, виноваты плюсы?

quiet_readonly ★★★★
()
Ответ на: комментарий от Anon

Суть токова... Человечка попросили воркер на конфигурябельный пул потоков заменить. Этот кот, насколько я его понял, заряжает конфиг для пула потоков. Читает количество воркеров из конфига, пристегивает лямбды вместо коллбэков... Одна лямбда пишет в базу, вторая - гасит потоки, когда «все». Но... we need to go deeper... эта заполнялка конфига сама внутри лямбды, которая вызывается непосредственно там, где написана - в списке инициализации конструктора очереди :)

slackwarrior ★★★★★
() автор топика
Последнее исправление: slackwarrior (всего исправлений: 2)

А в чём проблема? Кристально понятный код, разве что с отступами небольшая беда и лишние скобки после assert.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Веселые старты по умению разбираться в чужом коде открыты:)

slackwarrior ★★★★★
() автор топика

надо бы мне спецификацию C++11 почитать, а то я что-то плюсы с трудом узнал в сабже :)

Harald ★★★★★
()

Что сказать-то хотел?

yoghurt ★★★★★
()
Ответ на: комментарий от slackwarrior

Скучно же было, поэтому так и сделал.

anonymous
()
Ответ на: комментарий от slovazap

В коде ещё куча проблем чисто прикладного характера. Например, в лямбде, выполняющей основную работу, в хвост и гриву используется queue_, который конструируется в том же списке инициализации. Если конструктор worker_'а сразу же запустит потоки, а в объявлении класса кто-то поменяет порядок следования queue_ и worker_, то получится упс. Да и вообще много мест, где что-то может пойти не так.

Gvidon ★★★★
()
LazyQueue::LazyQueue(const Utils::Properties& props)
:    queue_(props.getInteger("Queue.Size"))
,    worker_(queue_, 
    [ this, &props ]() -> ThreadPoolT::Config     
    { 
        auto stopThread = [] (boost::thread& t) { 
            t.interrupt();
            t.join();
        };

        auto fillEMessage = [ this ] (sql::PreparedStatement& stmt, const Parser::EMessage& er) {
                                            stmt.setUInt    (1,        er.getExecID());    //in execId bigint(13),
                                            ...
                                            stmt.setUInt    (11,    t.getSellerIsPrinted());        //in sIsPrint char(1)
                                    };

        auto doTask = [ this, &props, &fillEMessage ](){ 
            boost::this_thread::interruption_point();

            LogCategory* log = Log::instance()->createCategory("Server.Queue");
            try
            {
                ::Common::DBHelper db;
                db.init("DBWriter", props, log); 

                boost::posix_time::milliseconds delay(props.getInteger("Queue.WriteDelay"));

                while (true)
                {
                    boost::this_thread::interruption_point();
                    CoesMessage* msg;

                    while (queue_.dequeue(msg))
                    {
                            assert(msg && "Queue data seems like inconsistent");
                            if (msg->type() == MessageID::E)
                            {
                                Parser::EMessage& er = *(Parser::EMessage*)msg;
                                db.callPreparedStoredProc("CALL p_exe_report_LoadERepo(?,?,NOW(), ?,?,?,?,?,?,?,?)", er , fillEMessage);
                            }        
                    }
					LDebug(*log) << "queue is empty, wait for delay";
                    boost::this_thread::sleep(delay);
                    boost::this_thread::interruption_point();
                }
            }
            catch (const std::exception& e)
            {
                LError(*log) << std::string("Queue initialization error: ").append(e.what());
            }
        };
        ThreadPoolT::Config c = { 
            props.getInteger("Queue.Workers"),
            doTask,
            stopThread
        }; 
return c; }())//worker_
{}

Примерно так я понял, что оно вообще делает :)

slackwarrior ★★★★★
() автор топика
Последнее исправление: slackwarrior (всего исправлений: 2)
Ответ на: комментарий от slackwarrior

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

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Ну, в этом треде речь про один язык... Ну почти)

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Да я чуть борщом не подавился на этой фразе.

anonymous
()
Ответ на: комментарий от anonymous

Лямбди эту останавливающую нить!

А, вот что он имел в виду!11

tailgunner ★★★★★
()
Ответ на: комментарий от wota

а) он пишет лапшу и не умеет разделять код

Да

б) бустом пользуются только мудаки

Чего чего???

в) он не умеет форматировать код

Ну, это так, но не очень важно тут

nerdogeek
()
Ответ на: комментарий от nerdogeek

Чего чего???

boost::posix_time::milliseconds
boost::this_thread::sleep
...

типичный код на бусте, а нормальный человек просто возьмет int и qSleep, например, и читаться будет на порядок лучше, при том не будет тонн шаблонов при компиляции и невразумительных ошибок от них

wota ★★
()
Ответ на: комментарий от Gvidon

Будет ворнинх. -Werror спасёт отца русской демократии.

nanoolinux ★★★★
()
Ответ на: комментарий от Gvidon

Ну да, тянуть Qt под каждый чих гораздо лучше

это для кроссплатформенного кода, и там, если сравнивать qtcore (весь Qt тоже не нужен) и boost, выбор очевиден

wota ★★
()

Нормальный кот. Я сам так пишу. Только без буста.

nanoolinux ★★★★
()
Ответ на: комментарий от wota

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

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Буст максимально разбит на независимые блоки и практически полностью реализован в заголовочных файлах

видел я всякие boost-filesystem и т.п. - монолитно, монструозно и требует линковки

Qt - библиотека, которую придётся тянуть в зависимостях

если делаешь кроссплаформенный софт - это лучшее, что можно и нужно тянуть в зависимостях, вместо всяких бустов

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.