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