Динамическая библиотека

динамическая библиот

Доброго времени суток всем!

Есть динамическая библиотека:

mydll.h

#ifndef MYDLL_H
#define MYDLL_H

#include "mydll_global.h"
#include <QDebug>
#include <QThread>

extern "C" {
MYDLLSHARED_EXPORT void startProcess();
MYDLLSHARED_EXPORT void stopProcess();
}
bool stop;
#endif // MYDLL_H

mydll_global.h

#ifndef MYDLL_GLOBAL_H
#define MYDLL_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYDLL_LIBRARY)
#  define MYDLLSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYDLLSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYDLL_GLOBAL_H

mydll.cpp

#include "mydll.h"

void startProcess()
{
    const QThread *curThread = QThread::currentThread();
    stop=false;
    while(stop==false)
    {                
        curThread->objectName();
        curThread->sleep(1);
    }
    qDebug()<<curThread->objectName();
}

void stopProcess()
{
    stop=true;
    qDebug()<<"process stopped";
}

Есть также проект:

mydll.h

#ifndef MYDLL_H
#define MYDLL_H
#include <QLibrary>
#include <QObject>
#include <QThread>
#include <QDebug>

class MyDll : public QObject
{
    Q_OBJECT
public:
    explicit MyDll(QObject *parent = nullptr);
    ~MyDll();
signals:
public slots:
    void startDevice();
    void stopDevice();
private:
    QString lib_name;
    QLibrary *lib;
};

#endif // MYDLL_H

myprocess.h

#ifndef MYPROCESS_H
#define MYPROCESS_H

#include <QObject>
#include <QDebug>
#include <QThread>
#include <QString>
#include "mydll.h"

class MyProcess : public QObject
{
    Q_OBJECT
public:
    explicit MyProcess(QObject *parent = nullptr);

signals:

public slots:
    void startAll();
    void startOne(int startDevice);
    void stopOne(int stopDevice);
    void stopAll();
private:
    QList<QThread*> threadsList;
    QList<MyDll*> mydllList;
};

#endif // MYPROCESS_H

mydll.cpp

#include "mydll.h"

MyDll::MyDll(QObject *parent) : QObject(parent)
{

}

MyDll::~MyDll()
{
    delete lib;
}

void MyDll::startDevice()
{
    static QString suffix = "";
#ifdef QT_DEBUG
    suffix = "d";
#endif
    QString dll_name="mydll";
    lib_name =dll_name + suffix;
    lib = new QLibrary;
    lib->setFileName(lib_name);
    if( !lib->load() ) {
        qDebug() << "Loading failed!";
    }
    typedef void ( *startProcess )();
    startProcess input = (startProcess) lib->resolve("startProcess");
    if( input ) {
        input();
    }
}

void MyDll::stopDevice()
{
    typedef void ( *stopProcess )();
    stopProcess input = (stopProcess) lib->resolve("stopProcess");
    if( input ) {
        input();
    }
    emit this->thread()->isFinished();
}

myprocess.cpp

#include "myprocess.h"

MyProcess::MyProcess(QObject *parent) : QObject(parent)
{

}

void MyProcess::startAll()
{
    for(int i=0;i<=5;i++)
    {
        auto *mydll = new MyDll;
        auto *thread = new QThread;
        mydll->setObjectName(QString::number(i));
        thread->setObjectName(QString::number(i));
        mydll->moveToThread(thread);
        QObject::connect(thread, SIGNAL(started()),mydll, SLOT(startDevice()));
        QObject::connect(thread, SIGNAL(finished()),mydll, SLOT(deleteLater()));
        thread->start();
        threadsList.append(thread);
        mydllList.append(mydll);

    }
}

void MyProcess::startOne(int startDevice)
{
    auto *mydll = new MyDll;
    auto *thread = new QThread;
    mydll->setObjectName(QString::number(startDevice));
    thread->setObjectName(QString::number(startDevice));
    mydll->moveToThread(thread);
    QObject::connect(thread, SIGNAL(started()),mydll, SLOT(startDevice()));
    QObject::connect(thread, SIGNAL(finished()),mydll, SLOT(deleteLater()));
    thread->start();
    threadsList.append(thread);
    mydllList.append(mydll);
}

void MyProcess::stopOne(int stopDevice)
{
    int i=0;
    for(auto m:mydllList){
        if(m->objectName()==QString::number(stopDevice))
        {
            m->stopDevice();
            mydllList.removeAt(i);
            break;
        }
        i++;
    }
    i=0;
    for(auto t:threadsList){
        if(t->objectName()==QString::number(stopDevice))
        {
            threadsList.removeAt(i);
            break;
        }
        i++;
    }
}

void MyProcess::stopAll()
{

}

main.cpp

#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include "myprocess.h"
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QThread *thread = new QThread;
    MyProcess *process = new MyProcess;
    process->moveToThread(thread);
    QObject::connect(thread, &QThread::started, process, &MyProcess::startAll);
    QObject::connect(thread, &QThread::finished, process, &MyProcess::deleteLater);
    thread->start();
    qDebug()<<"Thread started";
    int i;
    cin>>i;
    process->stopOne(i);
    cin>>i;
    return 0;
    return a.exec();
}

Проблема заключается в следующем: при попытке остановить определенный процесс, все остальные тоже завершаются. В динамической библиотеке переменная stop для всех принимает значение true.
Как такое возможно и можно ли этого избежать?
Вроде у каждого потока свой экземпляр lib. Или я ошибаюсь?

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

3
Evgenii Legotckoi
  • 8. Januar 2019 03:25
  • Die Antwort wurde als Lösung markiert.

Добрый день.

Не понятно, зачем вы вообще используете QLibrary. Создали бы класс с теми методами, а потом создавали бы объект того класса в своём приложении.

Здесь же вы подгружаете через QLibrary многократно одно и ту же библиотеку, хотя как правило это делают один раз. Возможно, что там указатель идёт на одно и тоже, поэтому и потоки сразу все схлопываются.

Сделайте с классом и без QLibrary, как показано было в статье, по которой вы вопрос задали.

Вроде у каждого потока свой экземпляр lib. Или я ошибаюсь?

Как я понимаю, экземляр QLibrary там разный, а вот содержит этот экземпляр всегда одну и ту же библиотеку. Не сталкивался с такой ситуацией, но по мне это не совсем корректный подход сам по себе. Лучше сделать класс, с нужным вам методами и создавать его экземпляр, как было показано в статье.

    Весь смысл в том, что у меня будут несколько библиотек, каждый из которых мог бы подгружаться неограниченное количество раз. В каждом из них будут методы с одними и теми же названиями, но с разным функционалом.

    Например: программа запущена и есть необходимость дополнить функционал одной из библиотек. Я завершаю только те потоки, которые используют эту библиотеку, остальные потоки, которые используют другие библиотеки остаются работать. После замены библиотеки я вновь запускаю остановленные потоки и они уже работают с дополненным функционалом.

      Evgenii Legotckoi
      • 8. Januar 2019 06:03
      • (bearbeitet)

      Извините, но идея бредовая. Вы превратили библиотеки в классы по сути. И вместо того, чтобы написать одну нормальную библиотеку с некоторыми классами, которые будут иметь возможность переопределения методов и имплементации для конкретных реализаций, Вы пытаетсь подгружать библиотеки как инстансы классов. Для переопределения методов и т.д. есть полиморфизм и объектное программирование. А то что вы делаете... это какая-то ерунда.

        Kommentare

        Nur autorisierte Benutzer können Kommentare posten.
        Bitte Anmelden oder Registrieren
        Letzte Kommentare
        A
        ALO1ZE19. Oktober 2024 08:19
        Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов5. Oktober 2024 07:51
        Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas55. Juli 2024 11:02
        QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        k
        kmssr8. Februar 2024 18:43
        Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
        Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
        Jetzt im Forum diskutieren
        J
        JacobFib17. Oktober 2024 03:27
        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
        JW
        Jhon Wick1. Oktober 2024 15:52
        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
        КГ
        Кирилл Гусарев27. September 2024 09:09
        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
        F
        Fynjy22. Juli 2024 04:15
        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

        Folgen Sie uns in sozialen Netzwerken