БГ
Jan. 8, 2019, 3:40 a.m.
Динамическая библиотека
Доброго времени суток всем!
Есть динамическая библиотека:
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. Или я ошибаюсь?
2
252
The question is asked by the articleQt/C++ - Tutorial 083. Creating a dynamic library and connecting it to another projectDo you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Добрый день.
Не понятно, зачем вы вообще используете QLibrary. Создали бы класс с теми методами, а потом создавали бы объект того класса в своём приложении.
Здесь же вы подгружаете через QLibrary многократно одно и ту же библиотеку, хотя как правило это делают один раз. Возможно, что там указатель идёт на одно и тоже, поэтому и потоки сразу все схлопываются.
Сделайте с классом и без QLibrary, как показано было в статье, по которой вы вопрос задали.
Как я понимаю, экземляр QLibrary там разный, а вот содержит этот экземпляр всегда одну и ту же библиотеку. Не сталкивался с такой ситуацией, но по мне это не совсем корректный подход сам по себе. Лучше сделать класс, с нужным вам методами и создавать его экземпляр, как было показано в статье.
Весь смысл в том, что у меня будут несколько библиотек, каждый из которых мог бы подгружаться неограниченное количество раз. В каждом из них будут методы с одними и теми же названиями, но с разным функционалом.
Например: программа запущена и есть необходимость дополнить функционал одной из библиотек. Я завершаю только те потоки, которые используют эту библиотеку, остальные потоки, которые используют другие библиотеки остаются работать. После замены библиотеки я вновь запускаю остановленные потоки и они уже работают с дополненным функционалом.
Извините, но идея бредовая. Вы превратили библиотеки в классы по сути. И вместо того, чтобы написать одну нормальную библиотеку с некоторыми классами, которые будут иметь возможность переопределения методов и имплементации для конкретных реализаций, Вы пытаетсь подгружать библиотеки как инстансы классов. Для переопределения методов и т.д. есть полиморфизм и объектное программирование. А то что вы делаете... это какая-то ерунда.