Russian Qt Forum
Ноябрь 25, 2024, 08:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QScriptEngine в dll  (Прочитано 21167 раз)
freebsdd
Гость
« : Декабрь 01, 2015, 21:45 »

Здравствуйте!

Вопрос такой, бьюсь уже не первую пару тройку часов

Создал библиотеку:

Код:

class CALCSHARED_EXPORT Calc : public QObject
{
    Q_OBJECT
    public:
        Calc(QObject* pwgt) : QObject(pwgt){
            qDebug() << "[DLL]::CREATE";
            QScriptEngine *sh_engine = new QScriptEngine(this);
            qDebug() << "the magic number is:" << sh_engine->evaluate("1 + 2").toNumber();
        }
};


вызываю из приложения (в приложении создаётся поток из него вызывается, не знаю важно ли это):

Код:

QScriptEngine *sh_engine = new QScriptEngine(this);
qDebug() << "the magic number is:" << sh_engine->evaluate("1 + 2").toNumber();


Calc *s_calc = new Calc(this);


В самом приложении выполняется, расчёт есть, всё хорошо, а обращаясь к библиотеке, не выполняется, пишет:


QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine


Пробовал вместо this, pwgt, вроде как дочерний создаётся, но эффект тот же


Пробовал создать ядро: QCoreApplication a(argc1, argv1), рассчиталось, показало цифру 3 и вылетело приложение


Добавил " : public QObject", убрал создание QCoreApplication, пишет, что не может создать дочку...

QObject: Cannot create children for a parent that is in a different thread.
(Parent is sh_worker_sheds(0x427fa8), parent's thread is QThread(0x418b60), current thread is QThread(0x3a55e0)




Подскажите пожалуйста, как в самой библиотеке можно использовать класс QScriptEngine, нужно именно в библиотеке, т.к. именно через неё все расчёты будут вестись
 
 
« Последнее редактирование: Декабрь 01, 2015, 21:54 от freebsdd » Записан
Bepec
Гость
« Ответ #1 : Декабрь 02, 2015, 08:30 »

Ну, тут вопросы уточняющие - dll используется в программе, написанной не на Qt? Походу да Улыбающийся
Тогда вам нужно самому запускать луп евент событий, или в просторечии QCoreApplication в потоке dll.

Подробности по ссылке http://qtsimple.blogspot.ru/2013/10/dll-noqt.html, задавать вопросы можете тут.

PS и напоминаю, писана эта статья для одной (1) длл подгружаемой в программе. При множественной загрузке возможны проблемы, там ещё допиливать надо было, но я не стал Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 02, 2015, 09:33 »

вызываю из приложения (в приложении создаётся поток из него вызывается, не знаю важно ли это):
Действуют обычные правила, а где сидит вызываемый, в dll или нет - без разницы

В самом приложении выполняется, расчёт есть, всё хорошо, а обращаясь к библиотеке, не выполняется, пишет:


QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine
Ну да, это нормально, многие Qt классы требуют чтобы QApplication был создан. Не понял с чем Вы так отчаянно бьетесь, чего хотите добиться? На то и библиотека чтобы вызываться из приложения. Да, сначала приложение должно создать QApplication, а потом уже обратиться к библиотеке, тогда она сможет создавать экземпляры нужных классов. А создавать QApplication в библиотеке смысла нет.   
Записан
Bepec
Гость
« Ответ #3 : Декабрь 02, 2015, 09:49 »

псс, igors окститесь Улыбающийся Есть такая тема, как использование Qt dll в noQt приложениях.

PS хотя кому я это говорю Веселый
Записан
freebsdd
Гость
« Ответ #4 : Декабрь 02, 2015, 10:13 »

Ну, тут вопросы уточняющие - dll используется в программе, написанной не на Qt? Походу да Улыбающийся
Тогда вам нужно самому запускать луп евент событий, или в просторечии QCoreApplication в потоке dll.

Подробности по ссылке http://qtsimple.blogspot.ru/2013/10/dll-noqt.html, задавать вопросы можете тут.

PS и напоминаю, писана эта статья для одной (1) длл подгружаемой в программе. При множественной загрузке возможны проблемы, там ещё допиливать надо было, но я не стал Улыбающийся

У меня и библиотека и приложение, всё написано на Qt 5.5. Библиотеку я думаю использовать, в своих приложениях пока только на Qt. Как в таком случае действовать, как запихнуть QScriptEngine в dll и вызывая функцию\процедуру из приложения, чтоб она работала\считала?
Записан
freebsdd
Гость
« Ответ #5 : Декабрь 02, 2015, 10:17 »

вызываю из приложения (в приложении создаётся поток из него вызывается, не знаю важно ли это):
Действуют обычные правила, а где сидит вызываемый, в dll или нет - без разницы

В самом приложении выполняется, расчёт есть, всё хорошо, а обращаясь к библиотеке, не выполняется, пишет:


QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine
Ну да, это нормально, многие Qt классы требуют чтобы QApplication был создан. Не понял с чем Вы так отчаянно бьетесь, чего хотите добиться? На то и библиотека чтобы вызываться из приложения. Да, сначала приложение должно создать QApplication, а потом уже обратиться к библиотеке, тогда она сможет создавать экземпляры нужных классов. А создавать QApplication в библиотеке смысла нет.   

Смысла то нет, пробовал уже всё что можно, но как сделать, что она работала, не могу понять, в тупик зашёл, как можно сделать реализацию?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 02, 2015, 10:25 »

Есть такая тема, как использование Qt dll в noQt приложениях.
Какое же здесь "noQt"?

Смысла то нет, пробовал уже всё что можно, но как сделать, что она работала, не могу понять, в тупик зашёл, как можно сделать реализацию?
Ну просто в приложении сначала создать QApplication, а потом уже вызывать ф-ции/классы dll.
Записан
freebsdd
Гость
« Ответ #7 : Декабрь 02, 2015, 11:07 »

Есть такая тема, как использование Qt dll в noQt приложениях.
Какое же здесь "noQt"?

Смысла то нет, пробовал уже всё что можно, но как сделать, что она работала, не могу понять, в тупик зашёл, как можно сделать реализацию?
Ну просто в приложении сначала создать QApplication, а потом уже вызывать ф-ции/классы dll.

Уточню, у меня: Консольное приложение -> создаётся основной поток -> создаются потоки с таймером в потоке(для каждой задачи свой) -> (в дочернем потоке, а именно в слоте по сигналу timeout()) выполняется функция из dll для расчёта арифметического - и вот она, не работает, хотя в этом же потоке (не обращаясь в библиотеку) выполняется QScriptEngine без проблем... У меня же уже есть QCoreApplication, для чего ещё раз создавать или я Вас не понял?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Декабрь 02, 2015, 11:58 »

У меня же уже есть QCoreApplication, для чего ещё раз создавать или я Вас не понял?
Создавать второй раз нельзя. Значит у Вас криво собрана dll. Распечатайте qApp из приложения и из dll и убедитесь что они равны (после создания QApplication). Убедитесь что приложение и dll используют одну и ту же QtCore
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Декабрь 02, 2015, 12:02 »

А нет ли статической инициализации в dll, в которой и создаётся QScriptEngine?

В любом случае не мешало бы в отладчике поставить breakpoint на создании QScriptEngine и посмотреть backtrace всех ниток.
« Последнее редактирование: Декабрь 02, 2015, 12:05 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
freebsdd
Гость
« Ответ #10 : Декабрь 02, 2015, 12:42 »

У меня же уже есть QCoreApplication, для чего ещё раз создавать или я Вас не понял?
Создавать второй раз нельзя. Значит у Вас криво собрана dll. Распечатайте qApp из приложения и из dll и убедитесь что они равны (после создания QApplication). Убедитесь что приложение и dll используют одну и ту же QtCore

Скажите, что такое "распечатайте qApp" ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 02, 2015, 12:47 »

Скажите, что такое "распечатайте qApp" ?
Код
C++ (Qt)
qDebug() << qApp;
Записан
freebsdd
Гость
« Ответ #12 : Декабрь 02, 2015, 12:53 »

А нет ли статической инициализации в dll, в которой и создаётся QScriptEngine?

В любом случае не мешало бы в отладчике поставить breakpoint на создании QScriptEngine и посмотреть backtrace всех ниток.


Мне стыдно, но отладчик не настраивал, пока не разбирался как установить его на QtCreator... Гляньте код, пожалуйста:


calc.h
Код:
#ifndef CALC_H
#define CALC_H

#include "calc_global.h"
#include <QObject>
//#include <QScriptEngine>
//#include <qDebug>

//class CALCSHARED_EXPORT Calc
//{

//    public:
//        Calc();
//};

class CALCSHARED_EXPORT Calc : public QObject {
    Q_OBJECT
    public:
        Calc(QObject *parent = 0);
};

#endif // CALC_H


calc_global.h
Код:
#ifndef CALC_GLOBAL_H
#define CALC_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(CALC_LIBRARY)
#  define CALCSHARED_EXPORT Q_DECL_EXPORT
#else
#  define CALCSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // CALC_GLOBAL_H


calc.cpp
Код:
#include "calc.h"
#include <QScriptEngine>
#include <qDebug>


Calc::Calc(QObject *parent) : QObject(parent){

    QScriptEngine *ml = new QScriptEngine(this);
    qDebug() << ml->evaluate("1+2+5").toNumber();

}


Создал для теста приложение GUI, от туда пытаюсь запустить:
Код:
void MainWindow::on_pushButton_3_clicked()
{
    Calc *mc = new Calc(this);

}


Ошибка, вернее две:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is MainWindow(0x17fea4), parent's thread is QThread(0x376028), current thread is QThread(0x3d0bf8)

QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine



Вроде всё хорошо, Есть Приложение, создаю дочку CALC , не может, почему? Что я не так делаю?

Бывает под носом ответ, но видать глаз мылиться, не вижу...
Записан
freebsdd
Гость
« Ответ #13 : Декабрь 02, 2015, 13:01 »

Скажите, что такое "распечатайте qApp" ?
Код
C++ (Qt)
qDebug() << qApp;

Благодарю за способ, сделал, интересный результат:

Код снизу, для наглядности, чтоб не листать страницу вверх\вниз... Туда добавил qDebug():

Gui:
Код:
void MainWindow::on_pushButton_3_clicked()
{
    qDebug() << "this: " << this;
    Calc *mc = new Calc(this);

}


calc.h
Код:
#ifndef CALC_H
#define CALC_H

#include "calc_global.h"
#include <QObject>

class CALCSHARED_EXPORT Calc : public QObject {
    Q_OBJECT
    public:
        Calc(QObject *parent = 0);
};

#endif // CALC_H

calc.cpp
Код:
#include "calc.h"
#include <QScriptEngine>
#include <qDebug>


Calc::Calc(QObject *parent) : QObject(parent){

    qDebug() << "parent: " << parent;
    qDebug() << "this: " << this;

    QScriptEngine *ml = new QScriptEngine(this);
    qDebug() << ml->evaluate("1+2+5").toNumber();

}


Результат:

GUI: this:  MainWindow(0x24fea0, name = "MainWindow")
Calc: QObject: Cannot create children for a parent that is in a different thread.
(Parent is MainWindow(0x24fea0), parent's thread is QThread(0x2c6028), current thread is QThread(0x326378)

Calc: parent:  MainWindow(0x24fea0, name = "MainWindow")

Calc: this:  Calc(0x323fd8)

Calc: QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine


Т.е. папаню видит, в библиотеку дескриптор передаётся, но почему тогда не создаётся QScriptEngine?


« Последнее редактирование: Декабрь 02, 2015, 13:03 от freebsdd » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Декабрь 02, 2015, 13:02 »

Мне стыдно, но отладчик не настраивал, пока не разбирался как установить его на QtCreator...
Разработка без отладки - довольно-таки странный подход...

Цитировать
Вроде всё хорошо, Есть Приложение, создаю дочку CALC , не может, почему? Что я не так делаю?
Судя по
Цитировать
QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine
приложения ещё нет
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.146 секунд. Запросов: 23.