Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.191.214] |
|
Сообщ.
#1
,
|
|
|
На самом начальном этапе запоролся. Как сделать задачу минималистично и чтобы работала? Непонятно, как пользоваться созданным потоком.
//Разброс разных задач потоками по ядрам. QThread *qThread_Core2 = new QThread; //g_qTimer_Read->moveToThread(qThread_Core2); //Если так сделать - функция, приконнекченная к таймеру, - перестает работать. При этом св-во IsActive таймера после запуска ->start() - True. //connect(qThread_Core2, SIGNAL(started()), this, SLOT(vTimer_Operations())); qThread_Core2->start(); bool bbb=qThread_Core2->isRunning(); //True. connect(g_qTimer_Read, SIGNAL(timeout()), this, SLOT(vTimer_Read())); |
Сообщ.
#2
,
|
|
|
Так и не смог. Даже на билдере было с этим проще. Qt - то еще г. В т.ч. конкретная версия Qt, 5.5.1, сейчас мешает своими багами в выделении памяти больших объемов.
|
Сообщ.
#3
,
|
|
|
Цитата Сергей85 @ Так и не смог Сергей85, не могу смотреть на твои мучения! Сделал для тебя демонстрационный проект, разбирая который, я надеюсь, ты найдешь для себя ответы на твои вопросы... MultiPulti По кнопке [►Start] запускаются три потока. В каждом потоке есть свой таймер, который срабатывает по своему интервалу, и передает в GUI-поток свое значение. Которое, соответственно, изменяет "свой" QLabel. Первый поток изменяет значение 1 раз в секунду, второй поток 10 раз в секунду, а третий поток 100 раз в секунду. По нажатии кнопки [Close] потоки останавливаются и уничтожаются, после этого программа завершается. MuliPulti.pro Скрытый текст QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 SOURCES += \ main.cpp \ dialog.cpp \ worker.cpp HEADERS += \ dialog.h \ worker.h # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target main.cpp Скрытый текст #include "dialog.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); } dialog.h Скрытый текст #ifndef DIALOG_H #define DIALOG_H #include <QtWidgets> #include <worker.h> class Dialog : public QDialog { Q_OBJECT QLabel *L1, *L2, *L3; QThread *Thread1, *Thread2, *Thread3; Worker *Work1, *Work2, *Work3; QVector <QLabel *> Labels; QPushButton *BS, *BC; public: Dialog(QWidget *parent = nullptr); public slots: void SlotStart(); void SlotClose(); void SlotUpdate(int iNo, int iValue); signals: void SigQuit(); }; #endif // DIALOG_H dialog.cpp Скрытый текст #include "dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent) { QGridLayout *G = new QGridLayout; L1 = new QLabel("0"); L2 = new QLabel("0"); L3 = new QLabel("0"); Labels.push_back(L1); Labels.push_back(L2); Labels.push_back(L3); BS = new QPushButton(tr("► Start")); BC = new QPushButton(tr("Close")); G->addWidget(L1, 0, 0, Qt::AlignCenter); G->addWidget(L2, 0, 1, Qt::AlignCenter); G->addWidget(L3, 0, 2, Qt::AlignCenter); G->addWidget(BS, 1, 1); G->addWidget(BC, 1, 2); setLayout(G); setMinimumSize(320, 120); connect(BS, &QPushButton::clicked, this, &Dialog::SlotStart); connect(BC, &QPushButton::clicked, this, &Dialog::SlotClose); } void Dialog::SlotStart() { BS->setEnabled(false); // создаем нити Thread1 = new QThread; Thread2 = new QThread; Thread3 = new QThread; Work1 = new Worker(nullptr, 0, 1000); Work2 = new Worker(nullptr, 1, 100); Work3 = new Worker(nullptr, 2, 10); Work1->moveToThread(Thread1); Work2->moveToThread(Thread2); Work3->moveToThread(Thread3); // коммутируем потоки с GUI потоком (и сами с собой для корректного финиша и удаления) connect(Thread1, &QThread::started, Work1, &Worker::SlotProcess); connect(Thread2, &QThread::started, Work2, &Worker::SlotProcess); connect(Thread3, &QThread::started, Work3, &Worker::SlotProcess); connect(Work1, &Worker::SigUpdate, this, &Dialog::SlotUpdate); connect(Work2, &Worker::SigUpdate, this, &Dialog::SlotUpdate); connect(Work3, &Worker::SigUpdate, this, &Dialog::SlotUpdate); connect(this, &Dialog::SigQuit, Thread1, &QThread::quit); connect(this, &Dialog::SigQuit, Thread2, &QThread::quit); connect(this, &Dialog::SigQuit, Thread3, &QThread::quit); connect(Work1, &Worker::SigFinished, Thread1, &QThread::quit); connect(Work2, &Worker::SigFinished, Thread2, &QThread::quit); connect(Work3, &Worker::SigFinished, Thread3, &QThread::quit); connect(Work1, &Worker::SigFinished, Work1, &Worker::deleteLater); connect(Work2, &Worker::SigFinished, Work2, &Worker::deleteLater); connect(Work3, &Worker::SigFinished, Work3, &Worker::deleteLater); connect(Thread1, &QThread::finished, Thread1, &QThread::deleteLater); connect(Thread2, &QThread::finished, Thread2, &QThread::deleteLater); connect(Thread3, &QThread::finished, Thread3, &QThread::deleteLater); Thread1->start(); Thread2->start(); Thread3->start(); } void Dialog::SlotClose() { emit SigQuit(); close(); } void Dialog::SlotUpdate(int iNo, int iValue) { Labels[iNo]->setText(QString::number(iValue)); } worker.h Скрытый текст #ifndef WORKER_H #define WORKER_H #include <QObject> #include <QTimer> class Worker : public QObject { Q_OBJECT int Counter = 0; int No = 0; int Interval = 0; QTimer *Timer; public: explicit Worker(QObject *parent = nullptr, int iNo = 0, int iInterval = 0); public slots: void SlotProcess(); void SlotUpdate(); signals: void SigUpdate(int No, int iValue); void SigFinished(); }; #endif // WORKER_H worker.cpp Скрытый текст #include <QEventLoop> #include "worker.h" Worker::Worker(QObject *parent, int iNo, int iInterval) : QObject{parent}, No{iNo}, Interval{iInterval} { } void Worker::SlotProcess() { QEventLoop ev; Timer = new QTimer(this); Timer->setInterval(Interval); connect(Timer, &QTimer::timeout, this, &Worker::SlotUpdate); Timer->start(); ev.exec(); emit SigFinished(); } void Worker::SlotUpdate() { Counter++; emit SigUpdate(No, Counter); } Некоторые комментарии Возможно ты что-то знаешь, возможно не знаешь - поэтому пусть будет. Файл с проектом присоединяю. Прикреплённый файлMuliPulti.7z (3,35 Кбайт, скачиваний: 46) |