Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с потоками на Qt

15K
24 марта 2012 года
DragonHT
38 / / 02.08.2007
Создалась проблема с потоками в Qt. Пытаюсь создавать поток с получаемыми из базового потока данными.
Приложение компилируется но при запуске сразу схлопывается, причина именно в потоках, а вернее в их отсутствии.
Поток просто не создаётся, хотя на сколько я понял конструктор класса и исполняемый код я описал верно:

Класс потока:
thread.h
Код:
#ifndef 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 "mainwindow.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;
}
Также прикрепляю архив с проектом.
Надеюсь на вашу помощь.
Заранее спасибо за ответ.
Прикрепленные файлы:
4 Кб
Загрузок: 786
316
24 марта 2012 года
Alm3n
889 / / 29.05.2009
Заголовочник один не кинул в архив, дозалей.. Как определил, что поток не создаётся? Дебаг не работает?
Кстати, у тебя макроса Q_OBJECT в QThread нет. А он нужен.
15K
25 марта 2012 года
DragonHT
38 / / 02.08.2007
Цитата: Alm3n
Заголовочник один не кинул в архив, дозалей.. Как определил, что поток не создаётся? Дебаг не работает?
Кстати, у тебя макроса Q_OBJECT в QThread нет. А он нужен.


Какой заголовочник?
Судя по подключенным всё на месте.
Макрос? Не, не слышал... сделал как написано на сайте производителя... Дебаг странный либо ассемблерный либо говорит что не работает. Определил запустил без вложенных потоков и вообще без потоков результат одинаков... следовательно первый поток не создаётся...

316
25 марта 2012 года
Alm3n
889 / / 29.05.2009
Цитата:
C:\QtSDK\proj\qdirex\..\..\Desktop\Qt\4.8.0\mingw\include\ActiveQt\qaxobject.h:1: ошибка: ../../src/activeqt/container/qaxobject.h: No such file or directory


По поводу Q_OBJECT озадачил. Все объекты, которые имеют сигналы и слоты, должны иметь этот макрос.
http://doc.qt.nokia.com/4.7-snapshot/qobject.html#Q_OBJECT
Оказалось, что для собственных сигналов\слотов.

412
25 марта 2012 года
grgdvo
323 / / 04.07.2007
Я возможно неправ, но метод run не нужно ли как virtual декларировать?
316
25 марта 2012 года
Alm3n
889 / / 29.05.2009
Нужно, если предполагается наследование пользовательского класса ещё каким-нибудь.
15K
25 марта 2012 года
DragonHT
38 / / 02.08.2007
Цитата: Alm3n
Цитата:
C:\QtSDK\proj\qdirex\..\..\Desktop\Qt\4.8.0\mingw\include\ActiveQt\qaxobject.h:1: ошибка: ../../src/activeqt/container/qaxobject.h: No such file or directory


По поводу Q_OBJECT озадачил. Все объекты, которые имеют сигналы и слоты, должны иметь этот макрос.
http://doc.qt.nokia.com/4.7-snapshot/qobject.html#Q_OBJECT
Оказалось, что для собственных сигналов\слотов.



Заголовочник лечится просто, я в этом проекте ещё с QAxObject экспериментировал, забыл в *.pro файле конфиг один стереть. Щас перезалью файл проекта
А с макросом я так и не понял, он получается не нужен, просто когда сидел доку читал про потоки там ничего не было про него сказано, либо я не очень вниматьельно прочитал.

316
25 марта 2012 года
Alm3n
889 / / 29.05.2009
Цитата: DragonHT

А с макросом я так и не понял, он получается не нужен, просто когда сидел доку читал про потоки там ничего не было про него сказано, либо я не очень вниматьельно прочитал.


Это не из раздела про потоки, это из раздела про сигналы\слоты. Если твой объект использует свои сигналы\слоты, то его нужно подключаться. Мне почему-то всё время думалось, что если наследуешь объект с сигналами\слотами, то они становятся твоими. Я ошибся.

15K
26 марта 2012 года
DragonHT
38 / / 02.08.2007
Про макрос понятно, а вот с заголовочником не понимаю, открыл про-файл а там qaxobject и не подключён вообще. Странно ((
316
26 марта 2012 года
Alm3n
889 / / 29.05.2009
Он подключён через include в одном из файлов.
15K
26 марта 2012 года
DragonHT
38 / / 02.08.2007
Переправил с QAxObject. Теперь не должен ругаться.
Просто я так и не понимаю чисто теоретически класс описан нормально, вызов тоже поидее правильно сделан, но всё равно не работает?
Прикрепленные файлы:
4 Кб
Загрузок: 839
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог