diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2015-01-06 15:09:53 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-01-06 15:13:14 +0000 |
commit | ca1fb20a47d68caeb8ff5a658c5f365c10e56b59 (patch) | |
tree | f2a8f72a14907c2c0e0854ef43422b690dfce909 /vcl/workben | |
parent | 2005e34177503cc160348c4d63d70bfeab10d531 (diff) |
vcldemo: add threading mode.
Change-Id: I6ad5524c518a79cac7ec343398242515ef0bbb5f
Diffstat (limited to 'vcl/workben')
-rw-r--r-- | vcl/workben/vcldemo.cxx | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx index b42ef149ce7a..b4e5ed67c48d 100644 --- a/vcl/workben/vcldemo.cxx +++ b/vcl/workben/vcldemo.cxx @@ -17,6 +17,7 @@ #include <vcl/vclmain.hxx> #include <vcl/layout.hxx> +#include <salhelper/thread.hxx> #include <tools/urlobj.hxx> #include <tools/stream.hxx> @@ -1196,16 +1197,42 @@ class DemoWin : public WorkWindow { DemoRenderer &mrRenderer; bool underTesting; + bool testThreads; + + class RenderThread : public salhelper::Thread { + DemoWin &mrWin; + public: + RenderThread(DemoWin &rWin) + : Thread("vcldemo render thread") + , mrWin(rWin) + { + launch(); + } + virtual ~RenderThread() + { + join(); + } + virtual void execute() + { + SolarMutexGuard aGuard; + fprintf (stderr, "render from a different thread\n"); + mrWin.Paint(Rectangle()); + } + }; + rtl::Reference<RenderThread> mxThread; + public: - DemoWin(DemoRenderer &rRenderer) : + DemoWin(DemoRenderer &rRenderer, bool bThreads) : WorkWindow(NULL, WB_APP | WB_STDWORK), - mrRenderer(rRenderer) + mrRenderer(rRenderer), + testThreads(bThreads) { mrRenderer.addInvalidate(this); underTesting = false; } virtual ~DemoWin() { + mxThread.clear(); mrRenderer.removeInvalidate(this); } virtual void MouseButtonDown(const MouseEvent& rMEvt) SAL_OVERRIDE @@ -1213,9 +1240,16 @@ public: mrRenderer.SetSizePixel(GetSizePixel()); if (!mrRenderer.MouseButtonDown(rMEvt)) { - DemoWin *pNewWin = new DemoWin(mrRenderer); - pNewWin->SetText("Another interactive VCL demo window"); - pNewWin->Show(); + if (testThreads) + { // render this window asynchronously in a new thread + mxThread = new RenderThread(*this); + } + else + { // spawn another window + DemoWin *pNewWin = new DemoWin(mrRenderer, testThreads); + pNewWin->SetText("Another interactive VCL demo window"); + pNewWin->Show(); + } } } virtual void KeyInput(const KeyEvent& rKEvt) SAL_OVERRIDE @@ -1314,7 +1348,8 @@ class DemoApp : public Application fprintf(stderr," %s\n", rtl::OUStringToOString(aRenderers, RTL_TEXTENCODING_UTF8).getStr()); fprintf(stderr," --test <iterCount> - create benchmark data\n"); - fprintf(stderr, " --widgets - launch the widget test.\n"); + fprintf(stderr," --widgets - launch the widget test.\n"); + fprintf(stderr," --threads - render from multiple threads.\n"); fprintf(stderr, "\n"); return 0; } @@ -1326,7 +1361,7 @@ public: { try { - bool bWidgets = false; + bool bWidgets = false, bThreads = false; DemoRenderer aRenderer; for (sal_Int32 i = 0; i < GetCommandLineParamCount(); i++) @@ -1351,9 +1386,11 @@ public: } else if (aArg == "--widgets") bWidgets = true; + else if (aArg == "--threads") + bThreads = true; } - DemoWin aMainWin(aRenderer); + DemoWin aMainWin(aRenderer, bThreads); boost::scoped_ptr<DemoWidgets> aWidgets; aMainWin.SetText("Interactive VCL demo #1"); |