Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
new(allocator) Array(allocator);
std::vector<A> va1;
va1.push_back(A(...));
...
std::vector<A> va2 = std::move(va1);
void UpdateUI(Window *window)window можно объявить константным указателем, чтобы гарантировать невозможность его удаления и прочих нехороших действийclass IntermediateSource
{
public:
virtual const IntermediateData &GetSource(const String &) = 0;
};
class GUIReporter
{
public:
virtual GUIData GetState() = 0;
};
class Renderer
{
public:
Renderer(IntermediateSource *_source) :source(_source), shutdown(false)
{
//thread -> Renderer::Work()
}
void Shutdown() {shutdown = true;}
public:
//thread: renderer
void Work()
{
const IntermediateData &data = source->GetSource(/*...*/);
while (!shutdown)
{
//...
}
}
private:
IntermediateSource *source;
volatile bool shutdown;
};
class RenderManager : public IntermediateSource, public GUIReporter
{
public:
RenderManager()
{
//thread -> RenderManager::Run()
}
~RenderManager()
{
Shutdown();
for (int i=0; i<renderers.GetCount(); ++i)
renderers[i].Wait();
managerThread.Wait();
}
void Shutdown()
{
managerThread.Shutdown();
for (int i=0; i<renderers.GetCount(); ++i)
renderers[i].Shutdown();
}
//thread: manager
void Run()
{
//...
Renderer &newRenderer = renderers.Add(new Renderer(this));
//...
}
//thread: renderer[i]
virtual const IntermediateData &GetSource(const String &k)
{
intermediateDataMutex.Enter();
const IntermediateData &out = intermediateData.GetAdd(k);
intermediateDataMutex.Leave();
return out;
}
//thread: main
virtual GUIData GetCurrentState()
{
//...
}
private:
Thread managerThread;
Vector<Renderer> renderers;
Mutex intermediateDataMutex;
ArrayMap<String,IntermediateData> intermediateData;
};
class GUI()
{
public:
void OnTick() //OnTick() - если по таймеру, либо что-то вроде OnIdle()
{
GUIData guiData = guiReporter->GetCurrentState();
UpdateGUI(guiData);
}
private:
GUIReporter *guiReporter;
};
int main()
{
RenderManager manager;
GUI gui(&manager);
gui.Run();
}
GC в C++: преодоление соблазна