#include <QThread>
#include <QTimerEvent>
+#include <iostream>
+
class DrawingWindow::DrawingThread: public QThread {
public:
DrawingThread(DrawingWindow &w, ThreadFunction f)
void run()
{
- exit(threadFunction(drawingWindow));
+ threadFunction(drawingWindow);
}
private:
painter = new QPainter(image);
-#ifdef USE_PIXMAP_CACHE
- pixmap = new QPixmap(image->size());
- QPainter pixmapPainter(pixmap);
- pixmapPainter.drawImage(0, 0, *image);
-#endif
-
dirtyFlag = false;
setFocusPolicy(Qt::StrongFocus);
thread = new DrawingThread(*this, fun);
thread_started = false;
+
+ mutex_enabled = true;
}
DrawingWindow::~DrawingWindow()
{
+ mutex.lock();
+ mutex_enabled = false;
+ mutex.unlock();
+ std::cerr << "A\n";
+ thread->terminate();
+ std::cerr << "B\n";
+ thread->wait();
+ std::cerr << "C\n";
delete thread;
-#ifdef USE_PIXMAP_CACHE
- delete pixmap;
-#endif
delete painter;
delete image;
+ std::cerr << "D\n";
}
void DrawingWindow::setColor(const QColor &color)
{
QPainter widgetPainter(this);
QRect rect = ev->rect();
-#ifdef USE_PIXMAP_CACHE
- widgetPainter.drawPixmap(rect, *pixmap, rect);
-#else
lock();
- widgetPainter.drawImage(rect, *image, rect);
+ QImage imageCopy(*image);
unlock();
-#endif
+ widgetPainter.drawImage(rect, imageCopy, rect);
}
void DrawingWindow::showEvent(QShowEvent *ev)
if (ev->timerId() == timer.timerId()) {
lock();
if (dirtyFlag) {
-#ifdef USE_PIXMAP_CACHE
- QPainter pixmapPainter(pixmap);
- pixmapPainter.drawImage(dirtyRect, *image, dirtyRect);
-#endif
- dirtyFlag = false;
update(dirtyRect);
- timer.start(paintInterval, this);
+ dirtyFlag = false;
}
unlock();
+ timer.start(paintInterval, this);
} else {
QWidget::timerEvent(ev);
}
}
-void DrawingWindow::setDirtyRect()
-{
- setDirtyRect(QRect(0, 0, width(), height()));
-}
-
-void DrawingWindow::setDirtyRect(int x, int y)
-{
- setDirtyRect(QRect(x, y, 1, 1));
-}
-
-void DrawingWindow::setDirtyRect(int x1, int y1, int x2, int y2)
-{
- QRect r;
- r.setCoords(x1, y1, x2, y2);
- setDirtyRect(r.normalized());
-}
-
void DrawingWindow::setDirtyRect(const QRect &rect)
{
if (dirtyFlag) {