БГ
Булат Гиниятов7 января 2019 г. 16:40
Динамическая библиотека
Доброго времени суток всем!
Есть динамическая библиотека:
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
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
SH
- Sak Hax
- 25 апреля 2024 г. 21:00
C++ - Тест 001. Первая программа и типы данных
- Результат:33баллов,
- Очки рейтинга-10
l
- laei
- 23 апреля 2024 г. 16:19
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:10баллов,
- Очки рейтинга-10
Последние комментарии
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5 февраля 2024 г. 9:50
EVA25 декабря 2023 г. 18:30
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
DA
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
Dr Gangil Academics20 апреля 2024 г. 14:45
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев14 апреля 2024 г. 9:35
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
Добрый день.
Не понятно, зачем вы вообще используете QLibrary. Создали бы класс с теми методами, а потом создавали бы объект того класса в своём приложении.
Здесь же вы подгружаете через QLibrary многократно одно и ту же библиотеку, хотя как правило это делают один раз. Возможно, что там указатель идёт на одно и тоже, поэтому и потоки сразу все схлопываются.
Сделайте с классом и без QLibrary, как показано было в статье, по которой вы вопрос задали.
Как я понимаю, экземляр QLibrary там разный, а вот содержит этот экземпляр всегда одну и ту же библиотеку. Не сталкивался с такой ситуацией, но по мне это не совсем корректный подход сам по себе. Лучше сделать класс, с нужным вам методами и создавать его экземпляр, как было показано в статье.
Весь смысл в том, что у меня будут несколько библиотек, каждый из которых мог бы подгружаться неограниченное количество раз. В каждом из них будут методы с одними и теми же названиями, но с разным функционалом.
Например: программа запущена и есть необходимость дополнить функционал одной из библиотек. Я завершаю только те потоки, которые используют эту библиотеку, остальные потоки, которые используют другие библиотеки остаются работать. После замены библиотеки я вновь запускаю остановленные потоки и они уже работают с дополненным функционалом.
Извините, но идея бредовая. Вы превратили библиотеки в классы по сути. И вместо того, чтобы написать одну нормальную библиотеку с некоторыми классами, которые будут иметь возможность переопределения методов и имплементации для конкретных реализаций, Вы пытаетсь подгружать библиотеки как инстансы классов. Для переопределения методов и т.д. есть полиморфизм и объектное программирование. А то что вы делаете... это какая-то ерунда.