#include <DrawingThreadCore.h>
-DrawingThreadCore::DrawingThreadCore(int argc_, char **argv_)
- : QThread()
- , argc(argc_)
- , argv(argv_)
-{
-}
-
-DrawingThreadCore::~DrawingThreadCore()
-{
-}
-
void DrawingThreadCore::run()
{
- exit(this->runForReal(argc, argv));
-}
-
-int DrawingThreadCore::runForReal()
-{
- throw MissingImplementationException();
-}
-
-int DrawingThreadCore::runForReal(int /* argc */, char ** /* argv_ */)
-{
- return this->runForReal();
+ exit(this->runForReal());
}
class DrawingThreadCore: public QThread {
private:
- int argc;
- char **argv;
+ virtual int runForReal() = 0;
public:
- class MissingImplementationException { };
-
-protected:
- virtual int runForReal();
- virtual int runForReal(int argc, char **argv);
-
-public:
- DrawingThreadCore(int argc, char **argv);
- virtual ~DrawingThreadCore();
void run();
};
#include <QApplication>
-MainDrawingThread::MainDrawingThread(int argc, char **argv)
- : DrawingThreadCore(argc, argv)
+MainDrawingThread::MainDrawingThread(int argc_, char **argv_)
+ : DrawingThreadCore()
+ , argc(argc_)
+ , argv(argv_)
{
}
-MainDrawingThread::~MainDrawingThread()
+int MainDrawingThread::runForReal()
{
+ return MainDrawingThread::main(argc, argv);
}
int main(int argc, char *argv[])
#include <DrawingThreadCore.h>
class MainDrawingThread: public DrawingThreadCore {
-public:
- MainDrawingThread(int argc, char **argv);
- ~MainDrawingThread();
+private:
+ int argc;
+ char **argv;
+
+ template<int (*f)()>
+ static int mainWrapper(int, char **)
+ {
+ return f();
+ }
+
+ template<int (*f)(int, char **)>
+ static int mainWrapper(int argc, char **argv)
+ {
+ return f(argc, argv);
+ }
+
+ static int (*main)(int, char **);
int runForReal();
- int runForReal(int argc, char **argv);
+
+public:
+ MainDrawingThread(int argc_, char **argv_);
+
};
-#define main_thread MainDrawingThread::runForReal
+#define main_thread(...) \
+ /* int */ main_thread(__VA_ARGS__); \
+ int (*MainDrawingThread::main)(int, char **) = \
+ MainDrawingThread::mainWrapper<main_thread>; \
+ int main_thread(__VA_ARGS__)
#endif // !MAIN_DRAWING_THREAD_H
#include <DrawingArea.h>
#include <MainDrawingThread.h>
-int main_thread(int, char **)
+#include <iostream>
+
+int main_thread(int argc, char **argv)
{
// >>> insert main drawing code here <<<
+ std::cout << "[" << argc << "]\n";
+ for (int i = 0; i < argc; i++)
+ std::cout << " <" << argv[i] << ">\n";
+ while (true) {
+ sleep(1);
+ std::cout << '.' << std::flush;
+ }
+
return 0;
}