Проблема с потоками на Qt
Приложение компилируется но при запуске сразу схлопывается, причина именно в потоках, а вернее в их отсутствии.
Поток просто не создаётся, хотя на сколько я понял конструктор класса и исполняемый код я описал верно:
Класс потока:
thread.h
#define THREAD_H
#include <QThread>
#include <QDir>
#include <QTreeWidgetItem>
#include <QMutex>
int CNT = 0;
class Thread : public QThread {
QDir Dir;
QTreeWidgetItem* parent;
public:
Thread(QDir Dir, QTreeWidgetItem* parent)
{
Dir = Dir;
parent = parent;
}
void run(){
QList<QTreeWidgetItem*> Tree;
QString Path;
Path=Dir.path();
//recurCnt++;
Dir.setFilter(QDir::AllDirs | QDir::AllEntries | QDir::NoDotAndDotDot );
Dir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList list = Dir.entryInfoList();
for (int i = 0; i < list.size(); i++) {
QFileInfo fileInfo = list.at(i);
Tree.append(new QTreeWidgetItem());
Tree.last()->setText(0,fileInfo.fileName());
parent->addChild(Tree.last());
if (fileInfo.isDir())
{
CNT++;
Dir.cd(fileInfo.baseName());
while (true){
if (CNT<5){
Thread* tx = new Thread(Dir, Tree.last());
tx->start();
break;
}
}
}
Dir.setPath(Path);
}
CNT--;
}
};
#endif // THREAD_H
#include "ui_mainwindow.h"
#include <QtCore/QCoreApplication>
#include <QDir>
#include <QAxObject>
#include <iostream>
#include <QtGui/QApplication>
#include <QtTest/QTest>
#include "thread.h"
//int DrawFS (QDir Dir, QTreeWidgetItem* parent);
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDir dir;
dir.setPath("D:/");
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0,dir.absolutePath());
ui->treeWidget->insertTopLevelItem(0,item);
QList<QTreeWidgetItem*> Tree;
QString Path;
Path=dir.path();
//recurCnt++;
dir.setFilter(QDir::AllDirs | QDir::AllEntries | QDir::NoDotAndDotDot );
dir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList list = dir.entryInfoList();
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
Tree.append(new QTreeWidgetItem());
Tree.last()->setText(0,fileInfo.fileName());
item->addChild(Tree.last());
if (fileInfo.isDir())
{
dir.cd(fileInfo.baseName());
while (true){
if (CNT<5)
{
Thread* tx = new Thread(dir, item);
tx->start();
break;
}
}
dir.setPath(Path);
CNT--;
}
}
}
MainWindow::~MainWindow()
{
delete ui;
}
Надеюсь на вашу помощь.
Заранее спасибо за ответ.
Кстати, у тебя макроса Q_OBJECT в QThread нет. А он нужен.
Кстати, у тебя макроса Q_OBJECT в QThread нет. А он нужен.
Какой заголовочник?
Судя по подключенным всё на месте.
Макрос? Не, не слышал... сделал как написано на сайте производителя... Дебаг странный либо ассемблерный либо говорит что не работает. Определил запустил без вложенных потоков и вообще без потоков результат одинаков... следовательно первый поток не создаётся...
По поводу Q_OBJECT озадачил. Все объекты, которые имеют сигналы и слоты, должны иметь этот макрос.
http://doc.qt.nokia.com/4.7-snapshot/qobject.html#Q_OBJECT
Оказалось, что для собственных сигналов\слотов.
По поводу Q_OBJECT озадачил. Все объекты, которые имеют сигналы и слоты, должны иметь этот макрос.
http://doc.qt.nokia.com/4.7-snapshot/qobject.html#Q_OBJECT
Оказалось, что для собственных сигналов\слотов.
Заголовочник лечится просто, я в этом проекте ещё с QAxObject экспериментировал, забыл в *.pro файле конфиг один стереть. Щас перезалью файл проекта
А с макросом я так и не понял, он получается не нужен, просто когда сидел доку читал про потоки там ничего не было про него сказано, либо я не очень вниматьельно прочитал.
А с макросом я так и не понял, он получается не нужен, просто когда сидел доку читал про потоки там ничего не было про него сказано, либо я не очень вниматьельно прочитал.
Это не из раздела про потоки, это из раздела про сигналы\слоты. Если твой объект использует свои сигналы\слоты, то его нужно подключаться. Мне почему-то всё время думалось, что если наследуешь объект с сигналами\слотами, то они становятся твоими. Я ошибся.
Просто я так и не понимаю чисто теоретически класс описан нормально, вызов тоже поидее правильно сделан, но всё равно не работает?