БГ
Булат Гиниятов7. Januar 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
sf
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
МВ
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
ЛС
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Letzte Kommentare
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5. Oktober 2024 07:51
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5. Februar 2024 01:50
Jetzt im Forum diskutieren
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3. Oktober 2024 04:05
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…
КГ
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
Кирилл Гусарев27. September 2024 09:09
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
Добрый день.
Не понятно, зачем вы вообще используете QLibrary. Создали бы класс с теми методами, а потом создавали бы объект того класса в своём приложении.
Здесь же вы подгружаете через QLibrary многократно одно и ту же библиотеку, хотя как правило это делают один раз. Возможно, что там указатель идёт на одно и тоже, поэтому и потоки сразу все схлопываются.
Сделайте с классом и без QLibrary, как показано было в статье, по которой вы вопрос задали.
Как я понимаю, экземляр QLibrary там разный, а вот содержит этот экземпляр всегда одну и ту же библиотеку. Не сталкивался с такой ситуацией, но по мне это не совсем корректный подход сам по себе. Лучше сделать класс, с нужным вам методами и создавать его экземпляр, как было показано в статье.
Весь смысл в том, что у меня будут несколько библиотек, каждый из которых мог бы подгружаться неограниченное количество раз. В каждом из них будут методы с одними и теми же названиями, но с разным функционалом.
Например: программа запущена и есть необходимость дополнить функционал одной из библиотек. Я завершаю только те потоки, которые используют эту библиотеку, остальные потоки, которые используют другие библиотеки остаются работать. После замены библиотеки я вновь запускаю остановленные потоки и они уже работают с дополненным функционалом.
Извините, но идея бредовая. Вы превратили библиотеки в классы по сути. И вместо того, чтобы написать одну нормальную библиотеку с некоторыми классами, которые будут иметь возможность переопределения методов и имплементации для конкретных реализаций, Вы пытаетсь подгружать библиотеки как инстансы классов. Для переопределения методов и т.д. есть полиморфизм и объектное программирование. А то что вы делаете... это какая-то ерунда.