Bug Fixes in Educational
instantiate event loops in runner plugins rather than in RunnerTask and instantiate runners in background threads
Instantiating the event loops in the runner plugins rather than in RunnerTask resolves weired usage of QEventLoop: The synchronous runners were finished before QEventLoop::exec() was called. Somehow the finished signal of the runners still managed to quit the loop, such that exec() wouldn't block. Until Qt 4.8 we might just have been lucky...
Instantiating runners in the background thread avoids thread affinity issues wrt. to QEventLoop. In particular, QEventLoop instances would block a background thread forever because calling quit() or exit() wouldn't cause exec() to return.