Skip to content

Commit cbf3037

Browse files
fixed event-driven script abort crash, fixed GraphicsWidget thread problem
1 parent c087d12 commit cbf3037

File tree

15 files changed

+198
-76
lines changed

15 files changed

+198
-76
lines changed

trikCommunicator/trikCommunicator.pro

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,8 @@ QT += network
2929
DEFINES += TRIKCOMMUNICATOR_LIBRARY
3030

3131
uses(trikScriptRunner trikControl trikKernel)
32+
33+
INCLUDEPATH += \
34+
../trikScriptRunner/include/ \
35+
../trikControl/include/ \
36+
../trikKernel/include/ \

trikControl/src/display.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Display::Display(QThread &guiThread, const QString &startDirPath)
3333
, mGuiWorker(new GuiWorker())
3434
{
3535
mGuiWorker->moveToThread(&guiThread);
36+
QMetaObject::invokeMethod(mGuiWorker, "init");
3637
}
3738

3839
Display::~Display()

trikControl/src/guiWorker.cpp

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -30,46 +30,54 @@
3030
using namespace trikControl;
3131

3232
GuiWorker::GuiWorker()
33-
: mFontMetrics(mImageWidget.font())
3433
{
34+
35+
}
36+
37+
void GuiWorker::init()
38+
{
39+
mImageLabel.reset(new QLabel());
40+
mImageWidget.reset(new GraphicsWidget());
41+
mFontMetrics.reset(new QFontMetrics(mImageWidget->font()));
42+
3543
QHBoxLayout * const layout = new QHBoxLayout();
36-
mImageLabel.setScaledContents(true);
37-
layout->addWidget(&mImageLabel);
38-
mImageWidget.setLayout(layout);
39-
mImageWidget.setWindowState(Qt::WindowFullScreen);
40-
mImageWidget.setWindowFlags(mImageWidget.windowFlags() | Qt::WindowStaysOnTopHint);
44+
mImageLabel->setScaledContents(true);
45+
layout->addWidget(mImageLabel.data());
46+
mImageWidget->setLayout(layout);
47+
mImageWidget->setWindowState(Qt::WindowFullScreen);
48+
mImageWidget->setWindowFlags(mImageWidget->windowFlags() | Qt::WindowStaysOnTopHint);
4149
resetBackground();
4250
}
4351

4452
void GuiWorker::showImage(QString const &fileName)
4553
{
4654
if (!mImagesCache.contains(fileName)) {
4755
QPixmap pixmap(fileName);
48-
pixmap = pixmap.scaled(mImageWidget.size() - QSize(20, 20), Qt::KeepAspectRatio);
56+
pixmap = pixmap.scaled(mImageWidget->size() - QSize(20, 20), Qt::KeepAspectRatio);
4957
mImagesCache.insert(fileName, pixmap);
5058
}
5159

52-
mImageLabel.setPixmap(mImagesCache.value(fileName));
53-
mImageWidget.show();
60+
mImageLabel->setPixmap(mImagesCache.value(fileName));
61+
mImageWidget->show();
5462
}
5563

5664
void GuiWorker::addLabel(QString const &text, int x, int y)
5765
{
5866
QLabel *label = findLabel(x, y);
59-
label = label ? label : new QLabel(&mImageWidget);
67+
label = label ? label : new QLabel(mImageWidget.data());
6068
label->setText(text);
61-
label->setStyleSheet(QString("color: %1").arg(mImageWidget.currentPenColor().name()));
69+
label->setStyleSheet(QString("color: %1").arg(mImageWidget->currentPenColor().name()));
6270

6371
// There is no layout for the label, so its size cannot be set automatically. We set
6472
// it with QFontMetrics.
65-
label->setGeometry(x, y, mFontMetrics.width(text), mFontMetrics.height());
73+
label->setGeometry(x, y, mFontMetrics->width(text), mFontMetrics->height());
6674

6775
label->show();
6876
if (!mLabels.contains(x ^ y, label)) {
6977
mLabels.insertMulti(x ^ y, label);
7078
}
7179

72-
mImageWidget.show();
80+
mImageWidget->show();
7381
}
7482

7583
void GuiWorker::removeLabels()
@@ -89,7 +97,7 @@ void GuiWorker::deleteWorker()
8997

9098
void GuiWorker::setBackground(QString const &color)
9199
{
92-
QPalette palette = mImageWidget.palette();
100+
QPalette palette = mImageWidget->palette();
93101

94102
if (color == tr("white")) {
95103
palette.setColor(QPalette::Window, Qt::white);
@@ -129,41 +137,41 @@ void GuiWorker::setBackground(QString const &color)
129137
palette.setColor(QPalette::Window, QColor(color));
130138
}
131139

132-
mImageWidget.setPalette(palette);
133-
mImageWidget.show();
140+
mImageWidget->setPalette(palette);
141+
mImageWidget->show();
134142
}
135143

136144
void GuiWorker::resetBackground()
137145
{
138-
QPalette palette = mImageWidget.palette();
146+
QPalette palette = mImageWidget->palette();
139147
palette.setColor(QPalette::Window, Qt::lightGray);
140-
mImageWidget.setPalette(palette);
148+
mImageWidget->setPalette(palette);
141149
}
142150

143151
void GuiWorker::setPainterColor(QString const &color)
144152
{
145-
mImageWidget.setPainterColor(color);
153+
mImageWidget->setPainterColor(color);
146154
}
147155

148156
void GuiWorker::setPainterWidth(int penWidth)
149157
{
150-
mImageWidget.setPainterWidth(penWidth);
158+
mImageWidget->setPainterWidth(penWidth);
151159
}
152160

153161
void GuiWorker::clear()
154162
{
155-
mImageWidget.deleteAllItems();
156-
mImageWidget.setPainterColor("black");
157-
mImageWidget.setPainterWidth(0);
158-
mImageWidget.hide();
163+
mImageWidget->deleteAllItems();
164+
mImageWidget->setPainterColor("black");
165+
mImageWidget->setPainterWidth(1);
166+
mImageWidget->hide();
159167
removeLabels();
160-
mImageLabel.setPixmap(QPixmap());
168+
mImageLabel->setPixmap(QPixmap());
161169
resetBackground();
162170
}
163171

164172
void GuiWorker::hide()
165173
{
166-
mImageWidget.hide();
174+
mImageWidget->hide();
167175
}
168176

169177
QLabel *GuiWorker::findLabel(int x, int y) const
@@ -179,35 +187,35 @@ QLabel *GuiWorker::findLabel(int x, int y) const
179187

180188
void GuiWorker::drawPoint(int x, int y)
181189
{
182-
mImageWidget.drawPoint(x, y);
183-
mImageWidget.update();
184-
mImageWidget.show();
190+
mImageWidget->drawPoint(x, y);
191+
mImageWidget->update();
192+
mImageWidget->show();
185193
}
186194

187195
void GuiWorker::drawLine(int x1, int y1, int x2, int y2)
188196
{
189-
mImageWidget.drawLine(x1, y1, x2, y2);
190-
mImageWidget.update();
191-
mImageWidget.show();
197+
mImageWidget->drawLine(x1, y1, x2, y2);
198+
mImageWidget->update();
199+
mImageWidget->show();
192200
}
193201

194202
void GuiWorker::drawRect(int x, int y, int width, int height)
195203
{
196-
mImageWidget.drawRect(x, y, width, height);
197-
mImageWidget.update();
198-
mImageWidget.show();
204+
mImageWidget->drawRect(x, y, width, height);
205+
mImageWidget->update();
206+
mImageWidget->show();
199207
}
200208

201209
void GuiWorker::drawEllipse(int x, int y, int width, int height)
202210
{
203-
mImageWidget.drawEllipse(x, y, width, height);
204-
mImageWidget.update();
205-
mImageWidget.show();
211+
mImageWidget->drawEllipse(x, y, width, height);
212+
mImageWidget->update();
213+
mImageWidget->show();
206214
}
207215

208216
void GuiWorker::drawArc(int x, int y, int width, int height, int startAngle, int spanAngle)
209217
{
210-
mImageWidget.drawArc(x, y, width, height, startAngle, spanAngle);
211-
mImageWidget.update();
212-
mImageWidget.show();
218+
mImageWidget->drawArc(x, y, width, height, startAngle, spanAngle);
219+
mImageWidget->update();
220+
mImageWidget->show();
213221
}

trikControl/src/guiWorker.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <QtCore/qglobal.h>
1818
#include <QtCore/QMultiHash>
1919
#include <QtCore/QList>
20+
#include <QtCore/QScopedPointer>
2021
#include <QtGui/QPixmap>
2122
#include <QtGui/QFontMetrics>
2223

@@ -109,17 +110,20 @@ public slots:
109110
/// @param spanAngle - end andle.
110111
void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle);
111112

113+
/// Initializes widget. Shall be called when widget is moved to correct thread. Not supposed to be called from .qts.
114+
void init();
115+
112116
private:
113117
void resetBackground();
114118

115119
/// Returns existing label with given coordinates or NULL if no such label exists.
116120
QLabel *findLabel(int x, int y) const;
117121

118-
GraphicsWidget mImageWidget;
119-
QLabel mImageLabel;
122+
QScopedPointer<GraphicsWidget> mImageWidget;
123+
QScopedPointer<QLabel> mImageLabel;
120124
QHash<QString, QPixmap> mImagesCache;
121125
QMultiHash<int, QLabel *> mLabels; // Has ownership.
122-
QFontMetrics mFontMetrics;
126+
QScopedPointer<QFontMetrics> mFontMetrics;
123127
};
124128

125129
}

trikGui/controller.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ void Controller::scriptExecutionCompleted()
7676
if (mRunningWidget) {
7777
mRunningWidget->releaseKeyboard();
7878
mRunningWidget->close();
79-
delete mRunningWidget;
79+
80+
// Here we can be inside handler of mRunningWidget key press event.
81+
mRunningWidget->deleteLater();
8082
mRunningWidget = NULL;
8183
}
8284
}

trikGui/trikGui.pro

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,6 @@
1414

1515
include(../global.pri)
1616

17-
TRIKKERNEL_DIR = ../trikKernel/
18-
TRIKCONTROL_DIR = ../trikControl/
19-
TRIKCOMMUNICATOR_DIR = ../trikCommunicator/
20-
TRIKSCRIPTRUNNER_DIR = ../trikScriptRunner/
21-
TRIKWIFI_DIR = ../trikWiFi/
22-
2317
HEADERS += \
2418
$$PWD/fileManagerWidget.h \
2519
$$PWD/runningWidget.h \
@@ -73,3 +67,10 @@ if (equals(QT_MAJOR_VERSION, 5)) {
7367
}
7468

7569
uses(trikKernel trikControl trikCommunicator trikScriptRunner trikWiFi)
70+
71+
INCLUDEPATH += \
72+
../trikKernel/include/ \
73+
../trikControl/include/ \
74+
../trikCommunicator/include/ \
75+
../trikScriptRunner/include/ \
76+
../trikWiFi/include/ \
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#pragma once
2+
3+
/* Copyright 2014 CyberTech Labs Ltd.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License. */
16+
17+
#include <QtCore/QObject>
18+
#include <QtCore/QString>
19+
#include <QtCore/QThread>
20+
#include <QtCore/QHash>
21+
#include <QtCore/QDebug>
22+
23+
namespace trikKernel {
24+
25+
/// Debug helper that logs function entry and exit.
26+
class Debugger : public QObject
27+
{
28+
Q_OBJECT
29+
30+
public:
31+
/// Constructor.
32+
/// @param methodName - name of a method to be logged
33+
Debugger(QString const &methodName);
34+
35+
~Debugger();
36+
37+
private:
38+
QString const mMethodName;
39+
static QHash<QThread *, int> mIndent;
40+
};
41+
42+
}
43+
44+
/// Macro to log method entry and exit.
45+
#define L trikKernel::Debugger const debugger(Q_FUNC_INFO)

trikKernel/include/trikKernel/fileUtils.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#pragma once
2+
13
/* Copyright 2013 - 2014 Yurii Litvinov, CyberTech Labs Ltd.
24
*
35
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,8 +14,6 @@
1214
* See the License for the specific language governing permissions and
1315
* limitations under the License. */
1416

15-
#pragma once
16-
1717
#include <QtCore/QString>
1818

1919
namespace trikKernel {

trikKernel/src/debug.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/* Copyright 2014 CyberTech Labs Ltd.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License. */
14+
15+
#include "debug.h"
16+
17+
using namespace trikKernel;
18+
19+
QHash<QThread *, int> Debugger::mIndent;
20+
21+
Debugger::Debugger(QString const &methodName)
22+
: mMethodName(methodName)
23+
{
24+
QString const indent(mIndent[thread()], ' ');
25+
QString const str = QString("%1(Thread %2) Entering %3")
26+
.arg(indent)
27+
.arg(reinterpret_cast<int>(thread()))
28+
.arg(mMethodName);
29+
30+
qDebug() << str.toStdString().c_str();
31+
++mIndent[thread()];
32+
}
33+
34+
Debugger::~Debugger()
35+
{
36+
--mIndent[thread()];
37+
QString const indent(mIndent[thread()], ' ');
38+
QString const str = QString("%1(Thread %2) Exiting %3")
39+
.arg(indent)
40+
.arg(reinterpret_cast<int>(thread()))
41+
.arg(mMethodName);
42+
43+
qDebug() << str.toStdString().c_str();
44+
}

trikKernel/trikKernel.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ include(../global.pri)
1616

1717
HEADERS += \
1818
$$PWD/include/trikKernel/fileUtils.h \
19+
$$PWD/include/trikKernel/debug.h \
1920

2021
SOURCES += \
2122
$$PWD/src/fileUtils.cpp \
23+
$$PWD/src/debug.cpp \
2224

2325
TEMPLATE = lib
2426

0 commit comments

Comments
 (0)