Problem z wątkami w Qt.

0

Witam,

mam prosty program bazujący na tutorialu:

korzystam z c++ MSV, nie piszę tego w qt creator.

Wydaje mi się, że jak się kliknie start u mnie to wszystko działa, jednak aktualny stan liczby powiększanej nie jest przekazywany do label.

Oto kody:


#ifndef WATKI23_H
#define WATKI23_H

#include <QtGui/QMainWindow>
#include "ui_watki23.h"
#include "MyThread.h"

class watki23 : public QMainWindow
{
    Q_OBJECT

public:
    watki23(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~watki23();
    MyThread *mThread;

private:
    Ui::watki23Class ui;

public slots:
    void onNumberChange(int number1);
    private slots:

    void on_pushButton_2_clicked();
    void on_pushButton_clicked();
};

#endif // WATKI23_H

#include "watki23.h"
#include "ui_watki23.h"

watki23::watki23(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

    mThread = new MyThread(this);

    connect(mThread, SIGNAL(NumberChange(int)), this, SLOT(onNumberChange(int)));
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
    connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(on_pushButton_2_clicked(int)));
}

watki23::~watki23()
{

}

void watki23::onNumberChange(int number1)
{
    ui.label->setText(QString::number(number1));
}

void watki23::on_pushButton_clicked()
{
    mThread->start();
}

void watki23::on_pushButton_2_clicked()
{
    mThread->Stop = true;
}

#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    ~MyThread(void);
    void run();
    bool Stop;

signals:
    void NumberChange(int);

public slots:

};

#include "MyThread.h"
#include <QtCore>

MyThread::MyThread(QObject *parent) : QThread(parent)
{
}

MyThread::~MyThread(void)
{
}

void MyThread::run()
{
    for(int i=0; i<10000; i++)
    {
        QMutex mutex;
        mutex.lock();
        if(this->Stop) break;
        mutex.unlock();

        emit NumberChange(i);
    }
}

Proszę o pomoc.

0

Dodaj na początku MyThread::run() wywołanie funkcji exec().
Stawiam na to,że z uwagi na połączenie kolejkowane pomiędzy sygnałem i slotem znajdującymi się w różnych wątkach komunikat nie jest przetwarzany z uwagi na brak event loopa.

0

też nie działa, możecie mi polecić gdzie znajdę coś na temat wątków w Qt ale pisanych przy pomocy Microsoft Visual Studio?

0

Hm ciekawe...no nic,to po kolei jedziemy,sprawdź czy connect() zwrócił true.

0

tak connect() zwraca true

0

jeżeli nie chcą się wyświetlić odpowiednie wartości to jak inaczej mogę sprawdzić czy te wątki u mnie działają?

0

Wyrzuć muteksa.Projekt testowy na szybko działa:

testQtableview::testQtableview(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

    t=new TestThread(this);
    connect(t,SIGNAL(sendNumb(int)),this,SLOT(sl(int)));
    connect(ui.actionStart_Test_Thread,SIGNAL(triggered()),this,SLOT(startThread()));
}

testQtableview::~testQtableview()
{
    delete t;
}

void testQtableview::sl(int i)
{
    QMessageBox::about(this,0,QString::number(i));
}
void testQtableview::startThread(void)
{
    t->start();
}
void TestThread::run(void)
{
    for(int cnt=0;cnt<5;cnt++) emit sendNumb(cnt);
    //exec();
}

Dostaję messageboxy z kolejnymi cyframi,tak jak to być powinno.

0

Zadziałało, dzięki Ci wielkie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0