Russian Qt Forum
Июнь 16, 2024, 04:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QList<MyTheard>  (Прочитано 15459 раз)
akaMDA
Гость
« Ответ #15 : Ноябрь 11, 2010, 15:06 »

а KDE есть на qnx?
Записан
BlackTass
Гость
« Ответ #16 : Ноябрь 11, 2010, 20:51 »

Не слышал честно говоря) и не очень уверен что вам нужно оно. Задача не настолько критичная ко времени, чтобы идти на такие меры. Есть подозрение, что у вас проблемы с производительностью из-за самого подхода. Если расскажете поподробнее алгоритм и как вы пытаетесь его распараллелить, то может я или кто другой подскажет как лучше сделать, чтобы работало и на обычных ос
Записан
akaMDA
Гость
« Ответ #17 : Ноябрь 13, 2010, 13:27 »

Да вроде добился уже, что работает.
Но возникла проблема - если 1 поток и чен класса, то работает нормально. При использовании же QList начинает падать, т.к. элементы уходят из зоны видимости. Как ркшить эту проблему?
Записан
BlackTass
Гость
« Ответ #18 : Ноябрь 14, 2010, 13:51 »

Может стоит привести немного кода, чтобы было понятнее о чем вопрос?
Записан
akaMDA
Гость
« Ответ #19 : Ноябрь 14, 2010, 20:03 »

Код:
    for(int i = 0; i < strLsFiles.count(); ++i)
    {
        ltVT[i].init(this, strLsFiles.at(i));
        ltVT[i].start(QThread::TimeCriticalPriority);

    }

вот код))
сложность в том, что нада запускать этот цикл не в конструкторе виджета. т.е. конструктор QList запускается раньше.
При старт поток падает.
Записан
BlackTass
Гость
« Ответ #20 : Ноябрь 15, 2010, 01:09 »

Я так понимаю strLsFiles это некая локальная переменная, которая заполняется объектами (не указателями на них)? Покажите заполнение strLsFiles и метод init()
Записан
akaMDA
Гость
« Ответ #21 : Ноябрь 15, 2010, 15:25 »

QStringList strLsFiles - это член-данная класса, в которм запускаются потоки. В ней хранятся адреса текстовых файлов. Но к данной проблеме она отношения не имеет. если объявить несколько объктов не в QList - то работает отлично. Если же объявлять их в  QList - падают при запуске метода  start. Аналогично,если объект класса-потока объявить в функции. Следовательно при инициализации в  QList его элементы выходят за область видимости. Не могу пока решить эту проблему.

Код:
#ifndef VECTORINGTEXT_H
#define VECTORINGTEXT_H

#include "QtCore/QtCore"

class VectoringText : public QThread
{
public:
    VectoringText(QObject* parent = 0, QString str = "");
    VectoringText(const VectoringText& vt);
    virtual ~VectoringText();
    bool operator =(const VectoringText& vt);
    void init(QObject* parent = 0, QString str = "");
protected:
    void run();
private:
    QString fil_in;
    QString fil_out;
};

#endif // VECTORINGTEXT_H


#include "vectoringtext.h"

VectoringText::VectoringText(QObject* parent, QString str)
{
    setParent(parent);

    fil_in = str;

    fil_out = fil_in+"_CL.txt";
}

VectoringText::VectoringText(const VectoringText& vt)
{
    setParent(vt.parent());

    fil_in = vt.fil_in;

    fil_out = vt.fil_out;
}

VectoringText::~VectoringText()
{
}

bool VectoringText::operator =(const VectoringText& vt)
{
    setParent(vt.parent());

    fil_in = vt.fil_in;

    fil_out = vt.fil_out;

    return true;
}

void VectoringText::init(QObject* parent, QString str)
{
    setParent(parent);

    fil_in = str;

    fil_out = fil_in+"_CL.txt";
}

void VectoringText::run()
{
    QFile file_in(fil_in);
    if(!file_in.open(QIODevice::ReadOnly)) return;

    QFile file_out(fil_out);
    if (!file_out.open(QIODevice::WriteOnly)) return;

    QTextStream in(&file_in);

    QTextStream out(&file_out);

    char ch = ' ';

    char pre_ch = ' ';

    while (!in.atEnd())
    {
        in>>ch;

        out<<ch;

        pre_ch = ch;
    }

    file_in.close();

    file_out.close();

    exec();
}



/*
 * File:   WizardPage2.h
 * Author: akaMDA
 *
 * Created on 29 ������� 2010 �., 9:52
 */

#ifndef WIZARDPAGE2_H
#define WIZARDPAGE2_H

#include <QtGui/QtGui>
#include "vectoringtext.h"

class WizardPage2 : public QWizardPage {
    Q_OBJECT
public:
    WizardPage2(QWidget* parent);
    WizardPage2(QWidget* parent, const WizardPage2& orig);
    virtual ~WizardPage2();
    void setTextStat(QString str);
    void begin();
private:
    QVBoxLayout* lay;
    QLabel* lbPict;
    QLabel* lbTextStat;
    QStringList strLsFiles;
    void initializePage();
    QList<VectoringText> ltVT;
    VectoringText vt;
    QStack<bool> stack_thread;
};

#endif /* WIZARDPAGE2_H */




/*
 * File:   WizardPage2.cpp
 * Author: akaMDA
 *
 * Created on 29 Октябрь 2010 г., 9:52
 */

#include "WizardPage2.h"

WizardPage2::WizardPage2(QWidget* parent) {
    setParent(parent);

    lay = new QVBoxLayout(this);

    lbPict = new QLabel(tr("Картинка часов"));
    lbPict->setAlignment(Qt::AlignCenter);
    lay->addWidget(lbPict, Qt::AlignCenter);

    lbTextStat = new QLabel(tr("Состояние процесса"));
    lbTextStat->setAlignment(Qt::AlignCenter);
    lay->addWidget(lbTextStat, Qt::AlignCenter);

    setLayout(lay);
}

WizardPage2::WizardPage2(QWidget* parent, const WizardPage2& orig) {
}

WizardPage2::~WizardPage2() {
}

void WizardPage2::setTextStat(QString str)
{
    lbTextStat->setText(str);
}

void  WizardPage2::initializePage()
{
     strLsFiles.append(field("File").toStringList());

     setTextStat(tr("Инициализация..."));

     begin();
}

void WizardPage2::begin()
{
    setTextStat(tr("Векторизация текста"));

    vt.init(this, strLsFiles.at(0));
    vt.start(QThread::TimeCriticalPriority);
    for(int i = 0; i < strLsFiles.count(); ++i)
    {
        ltVT[i](this, strLsFiles.at(i));
        ltVT[i].start(QThread::TimeCriticalPriority);

        stack_thread.push(1);
    }

    setTextStat(tr("Окончание"));
}


при вызове старт возникает ошибка -
Сигнатура проблемы:
  Имя события проблемы:   APPCRASH
  Имя приложения:   DataClustering.exe
  Версия приложения:   0.0.0.0
  Отметка времени приложения:   4ce12697
  Имя модуля с ошибкой:   QtCored4.dll
  Версия модуля с ошибкой:   4.7.0.0
  Отметка времени модуля с ошибкой:   4c8d7577
  Код исключения:   40000015
  Смещение исключения:   0000e680
  Версия ОС:   6.1.7600.2.0.0.768.11
  Код языка:   1049
  Дополнительные сведения 1:   0c46
  Дополнительные сведения 2:   0c468683048b9b6a0bbe53bf3a1fd8b9
  Дополнительные сведения 3:   d6d5
  Дополнительные сведения 4:   d6d507d9b5ddac7e52e2d5f5e0bb6da2

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\windows\system32\ru-RU\erofflps.txt
Записан
BlackTass
Гость
« Ответ #22 : Ноябрь 15, 2010, 22:47 »

Ок, а если в дебаге глянуть где падает? Так вроде на первый взгляд ничего криминального нет.
Записан
akaMDA
Гость
« Ответ #23 : Ноябрь 15, 2010, 23:05 »

Так смотрел. Падает на start(). Видимо выходит за область видимости. Видимо объекты QList не становятся членами класса...
Записан
BRE
Гость
« Ответ #24 : Ноябрь 15, 2010, 23:17 »

Код
C++ (Qt)
void WizardPage2::begin()
{
   ...
   for(int i = 0; i < strLsFiles.count(); ++i)
   {
       ltVT[i](this, strLsFiles.at(i)); // ???
       ltVT[i].start(QThread::TimeCriticalPriority);
 
       stack_thread.push(1);
   }
   ...
}
 

Список ltVT изначально вроде пуст, в него ничего не добавляли, а ты по индексу обращаешься к элементам которых нет.
Копировать объекты QObject (и их наследников) нельзя, тем более так как делаешь ты в конструкторе копирования/операторе=.
Записан
akaMDA
Гость
« Ответ #25 : Ноябрь 15, 2010, 23:22 »

Ммм, а как иницировать эти элементы тогда. Сначала пробовал запустить контструктор - но не дает
Записан
BRE
Гость
« Ответ #26 : Ноябрь 15, 2010, 23:41 »

Ммм, а как иницировать эти элементы тогда. Сначала пробовал запустить контструктор - но не дает
Т.к. копировать объекты классов наследников QObject нельзя, то придется использовать указатели.
Код
C++ (Qt)
class WizardPage2 : public QWizardPage {
   ...    
   QList<VectoringText*> ltVT;
};
 
   ...
 
   for(int i = 0; i < strLsFiles.count(); ++i)
   {
VectoringText *task = new VectoringText( strLsFiles[ i ] );
ltVT.append( task );
task->start();
   }
 
Записан
akaMDA
Гость
« Ответ #27 : Ноябрь 16, 2010, 15:18 »

Код:
 for(int i = 0; i < strLsFiles.count(); ++i)
    {
       VectoringText *vt = new VectoringText(this, strLsFiles[i]);

       ltVT.append(vt);
       ltVT[i]->start(QThread::TimeCriticalPriority);
    }

Во, вот так только)) Спасибо, заработало))
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.139 секунд. Запросов: 20.