mirror of
https://github.com/thp/pyotherside.git
synced 2025-02-05 08:08:23 +08:00
Don't pass QJSValue by value between different threads
This also avoids having additional signals when the callback isn't a callable by not creating a QJSValue referencing the callback.
This commit is contained in:
parent
a621f8c8ec
commit
c765bf3d03
@ -45,15 +45,15 @@ QPython::QPython(QObject *parent)
|
|||||||
QObject::connect(priv, SIGNAL(receive(QVariant)),
|
QObject::connect(priv, SIGNAL(receive(QVariant)),
|
||||||
this, SLOT(receive(QVariant)));
|
this, SLOT(receive(QVariant)));
|
||||||
|
|
||||||
QObject::connect(this, SIGNAL(process(QString,QVariant,QJSValue)),
|
QObject::connect(this, SIGNAL(process(QString,QVariant,QJSValue *)),
|
||||||
worker, SLOT(process(QString,QVariant,QJSValue)));
|
worker, SLOT(process(QString,QVariant,QJSValue *)));
|
||||||
QObject::connect(worker, SIGNAL(finished(QVariant,QJSValue)),
|
QObject::connect(worker, SIGNAL(finished(QVariant,QJSValue *)),
|
||||||
this, SLOT(finished(QVariant,QJSValue)));
|
this, SLOT(finished(QVariant,QJSValue *)));
|
||||||
|
|
||||||
QObject::connect(this, SIGNAL(import(QString,QJSValue)),
|
QObject::connect(this, SIGNAL(import(QString,QJSValue *)),
|
||||||
worker, SLOT(import(QString,QJSValue)));
|
worker, SLOT(import(QString,QJSValue *)));
|
||||||
QObject::connect(worker, SIGNAL(imported(bool,QJSValue)),
|
QObject::connect(worker, SIGNAL(imported(bool,QJSValue *)),
|
||||||
this, SLOT(imported(bool,QJSValue)));
|
this, SLOT(imported(bool,QJSValue *)));
|
||||||
|
|
||||||
thread.setObjectName("QPythonWorker");
|
thread.setObjectName("QPythonWorker");
|
||||||
thread.start();
|
thread.start();
|
||||||
@ -84,7 +84,11 @@ QPython::addImportPath(QString path)
|
|||||||
void
|
void
|
||||||
QPython::importModule(QString name, QJSValue callback)
|
QPython::importModule(QString name, QJSValue callback)
|
||||||
{
|
{
|
||||||
emit import(name, callback);
|
QJSValue *cb = 0;
|
||||||
|
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) {
|
||||||
|
cb = new QJSValue(callback);
|
||||||
|
}
|
||||||
|
emit import(name, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@ -168,7 +172,11 @@ QPython::evaluate(QString expr)
|
|||||||
void
|
void
|
||||||
QPython::call(QString func, QVariant args, QJSValue callback)
|
QPython::call(QString func, QVariant args, QJSValue callback)
|
||||||
{
|
{
|
||||||
emit process(func, args, callback);
|
QJSValue *cb = 0;
|
||||||
|
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) {
|
||||||
|
cb = new QJSValue(callback);
|
||||||
|
}
|
||||||
|
emit process(func, args, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant
|
QVariant
|
||||||
@ -220,23 +228,21 @@ QPython::call_sync(QString func, QVariant args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
QPython::finished(QVariant result, QJSValue callback)
|
QPython::finished(QVariant result, QJSValue *callback)
|
||||||
{
|
{
|
||||||
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) {
|
QJSValueList args;
|
||||||
QJSValueList args;
|
QJSValue v = callback->engine()->toScriptValue(result);
|
||||||
QJSValue v = callback.engine()->toScriptValue(result);
|
args << v;
|
||||||
args << v;
|
callback->call(args);
|
||||||
callback.call(args);
|
delete callback;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
QPython::imported(bool result, QJSValue callback)
|
QPython::imported(bool result, QJSValue *callback)
|
||||||
{
|
{
|
||||||
if (!callback.isNull() && !callback.isUndefined() && callback.isCallable()) {
|
QJSValueList args;
|
||||||
QJSValueList args;
|
QJSValue v = callback->engine()->toScriptValue(QVariant(result));
|
||||||
QJSValue v = callback.engine()->toScriptValue(QVariant(result));
|
args << v;
|
||||||
args << v;
|
callback->call(args);
|
||||||
callback.call(args);
|
delete callback;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -260,14 +260,14 @@ class QPython : public QObject {
|
|||||||
void error(QString traceback);
|
void error(QString traceback);
|
||||||
|
|
||||||
/* For internal use only */
|
/* For internal use only */
|
||||||
void process(QString func, QVariant args, QJSValue callback);
|
void process(QString func, QVariant args, QJSValue *callback);
|
||||||
void import(QString name, QJSValue callback);
|
void import(QString name, QJSValue *callback);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void receive(QVariant data);
|
void receive(QVariant data);
|
||||||
|
|
||||||
void finished(QVariant result, QJSValue callback);
|
void finished(QVariant result, QJSValue *callback);
|
||||||
void imported(bool result, QJSValue callback);
|
void imported(bool result, QJSValue *callback);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static QPythonPriv *priv;
|
static QPythonPriv *priv;
|
||||||
|
@ -32,15 +32,19 @@ QPythonWorker::~QPythonWorker()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
QPythonWorker::process(QString func, QVariant args, QJSValue callback)
|
QPythonWorker::process(QString func, QVariant args, QJSValue *callback)
|
||||||
{
|
{
|
||||||
QVariant result = qpython->call_sync(func, args);
|
QVariant result = qpython->call_sync(func, args);
|
||||||
emit finished(result, callback);
|
if (callback) {
|
||||||
|
emit finished(result, callback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
QPythonWorker::import(QString name, QJSValue callback)
|
QPythonWorker::import(QString name, QJSValue *callback)
|
||||||
{
|
{
|
||||||
bool result = qpython->importModule_sync(name);
|
bool result = qpython->importModule_sync(name);
|
||||||
emit imported(result, callback);
|
if (callback) {
|
||||||
|
emit imported(result, callback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,12 +34,12 @@ class QPythonWorker : public QObject {
|
|||||||
~QPythonWorker();
|
~QPythonWorker();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void process(QString func, QVariant args, QJSValue callback);
|
void process(QString func, QVariant args, QJSValue *callback);
|
||||||
void import(QString func, QJSValue callback);
|
void import(QString func, QJSValue *callback);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void finished(QVariant result, QJSValue callback);
|
void finished(QVariant result, QJSValue *callback);
|
||||||
void imported(bool result, QJSValue callback);
|
void imported(bool result, QJSValue *callback);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPython *qpython;
|
QPython *qpython;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user