All streams
Search
Write a publication
Pull to refresh
60
0
Vladislav Khorev @Mephi1984

Developer

Send message
Спасибо, исправил _1 на std::placeholders::_1 — теперь заработало. Буду знать.
Я вот нашел сравнение: timj.testbit.eu/2013/01/25/cpp11-signal-system-performance/
Вывод — Boost Signals это не самая быстрая реализация сигналов и слотов.
Когда изучу — опишу обязательно!
struct MyStruct
{
void method(int x)
{
}
};

boost::signal<void(int x)> mySignal;

MyStruct myStruct;

mySignal.connect(std::bind(&MyStruct::method, &myStruct, _1));


Компилятор ругается на последнюю строку многоэтажной ошибкой. Я ниасилил понять эту ошибку, поэтому избегаю std::bind.
Версию исправил.
std::bind не очень хорошо работает в Visual Studio 2010, поэтому я использую boost::bind
Я для этого использую boost::asio.
В основном потоке запускаю IoService, который вызывает run_one, а все вызовы сигнала заворачиваю в IoService.post. Получается как-то так, например:

boost::asio::io_service IoService;

boost::signal<void(int int)> TapDownSignal;

//В чужом потоке
void Application::OnTapDown(int x, int y)
{
    IoService.post(boost::bind(boost::ref(TapDownSignal), x, y));
}


//В основном потоке:
void ResourceManager::Update(int dt)
{
    ...
    IoService.run_one();
}
Спасибо, исправил.
Я использую сигналы и слоты в UI в своем движке. Очень удобно. Уже словил, кстати, несколько грабель — например, нельзя во время вызова сигнала что-то подключать к нему и отключать.
Конкуренты. :) Надо бы и мне выложить статью про 3D Wallpaper для Android.
У кого-нибудь получилось свести две точки в одну? Они слишком далеко друг от друга, у меня уже голова болит от попыток.
Можно посмотреть с другой стороны.

Вот так выглядит создание хлеба с использованием кода Бориса:

Cook* cookchief = CookFactory.GetNeededCook(BossSay);

OvenParams ovenParams = CreateOvenParams(GasIsAvailable(), MicrowaveOvenAvailable());

AbstractOven* oven = OvenFactory.CreateOvenFromParams(ovenParams);

Product* p = cookchief->cook(oven);

return p;


А вот так — с использованием кода Маркуса:

if (BossSay("We need to cook bread!"))
{
	if (GasIsAvailable())
	{
		
		Manager.gasLevel = GetGasLevel();
		Bread* bread = Manager.createBread(OT_GAS_OVEN, GetNeededBread(), STANDARD_RECEIPT);
		return bread;
	}
	else
	{
		Manager.gasLevel = 0;
		if (MicrowaveOvenAvailable())
		{
			Bread* bread = Manager.createBread(OT_MICROWAVE_OVEN, GetNeededBread(), FAST_RECEIPT);
			return bread;
		}
		else
		{
			int neededBread = GetNeededBread();
			if (VasyaWantsBreadToo())
			{
				neededBread = neededBread + 1;
			}
			
			Bread* bread = Manager.createBread(OT_HEAT_OVEN, neededBread, STANDARD_RECEIPT);
			return bread;
		}
	}
}
else if (BossSay("We need to cook bricks!"))
{
....
}
12 ...
7

Information

Rating
4,430-th
Location
Бишкек, Кыргызстан, Кыргызстан
Date of birth
Registered
Activity

Specialization

Fullstack Developer, Game Developer
Lead
From 550,000 ₽