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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QList<MyTheard>  (Прочитано 15457 раз)
akaMDA
Гость
« : Ноябрь 08, 2010, 16:05 »

Необходимо сделать QList<MyTheard>. Каждый поток обрабатывает 1 текстовый файл из QStringList strLsFiles. При этом количество текстовых файлов и соответственно элементов-потоков в данном случае неизвестно заранее, а ввожится в процессе работы. Подскажите пожалуйста, каким отбразом можно организовать запуск этих потоков в цикле for. Делаю
Код:
for(int i=0; i<strLsFiles->count(); i++){
MyTheard[i].run(strLsFiles[i]);
}
Не работает(((
подскаже как быть!
« Последнее редактирование: Ноябрь 08, 2010, 16:10 от akaMDA » Записан
UVV
Гость
« Ответ #1 : Ноябрь 08, 2010, 16:55 »

MyThread::start()
Записан
akaMDA
Гость
« Ответ #2 : Ноябрь 08, 2010, 16:59 »

Да, это я тут описался. Не работает.
Qobject is private
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Ноябрь 08, 2010, 17:12 »

Код MyTheard приведи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
akaMDA
Гость
« Ответ #4 : Ноябрь 10, 2010, 15:49 »

Код:
/* 
 * File:   PreEdit.h
 * Author: akaMDA
 *
 * Created on 29 Октябрь 2010 г., 19:57
 */

#ifndef PREEDIT_H
#define PREEDIT_H

#include <QtCore/QtCore>

class PreEdit : public QThread {
    Q_OBJECT
public:
    PreEdit(QObject* parent, QString f);
    virtual ~PreEdit();
protected:
    void run();
private:
    QTextStream* ts_in;
    QTextStream* ts_out;
    QString file;
    QFile* file_in;
    QFile* file_out;
};

#endif /* PREEDIT_H */

/*
 * File:   PreEdit.cpp
 * Author: akaMDA
 *
 * Created on 29 Октябрь 2010 г., 19:57
 */

#include "PreEdit.h"

PreEdit::PreEdit(QObject* parent, QString f){
    setParent(parent);

    file= f;

    file_in = new QFile(file);
    file_in->open(QIODevice::ReadOnly);

    QString fil = file.split('\\').last();

    file_out = new  QFile(fil);
    file_out->open(QIODevice::WriteOnly);

    ts_in = new QTextStream(file_in);
    ts_in->setCodec("Windows-1251");

    ts_out = new QTextStream(file_out);
    ts_out->setCodec("Windows-1251");
}

PreEdit::~PreEdit() {
}

void PreEdit::run(){
    QChar ch;
    
    QChar pre_ch=0x0000;

    while(!ts_in->atEnd())
    {
        *ts_in>>ch;

        if(ch >= 0x0430 && ch <= 0x044F | ch >= 0x0061 && ch <= 0x007A | ch >= 0x0030 && ch <= 0x003A) *ts_out<<ch; //вставка без изменений маленьких букв, цифр

        if(ch == 0x0014 && pre_ch == 0x0014) continue; //удаление нескольких пробелов

        if(ch >= 0x0410 && ch <= 0x042F | ch >= 0x0041 && ch <= 0x005A) *ts_out<<(ch+32); //перевод в нижний регистр

        if(ch == 0x0401 | ch == 0x0451) *ts_out<<0x0435; // замена ёЁ на е

        if(ch == 0x002A || ch == 0x002B || ch == 0x002D || ch == 0x002F || ch == 0x003A || ch == 0x003C || ch == 0x003D || ch == 0x003E)//символы
        {
            if(pre_ch == ' ')
            {
                *ts_out<<0x0435;
                *ts_out<<' ';
                pre_ch = ' ';
                continue;
            }
            if(pre_ch != ' ')
            {
                *ts_out<<' ';
                *ts_out<<0x0435;
                *ts_out<<' ';
                pre_ch = ' ';
                continue;
            }
        }

        else continue;

        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>

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<PreEdit> lsPreEdit;
};

#endif /* WIZARDPAGE2_H */

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

#include "WizardPage2.h"
#include "PreEdit.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);

    strLsFiles = new  QStringList;

    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());
     begin();
}

void WizardPage2::begin(){
    PreEdit pe(this, strLsFiles->at(0));
    pe.start(QThread::IdlePriority);
}


Компилится и собирается нормально, но при запуске происходит ошибка:
Прпкращена работа
Сигнатура проблемы:
  Имя события проблемы:   APPCRASH
  Имя приложения:   DataClustering.exe
  Версия приложения:   0.0.0.0
  Отметка времени приложения:   4cda94ab
  Имя модуля с ошибкой:   QtCored4.dll
  Версия модуля с ошибкой:   4.7.0.0
  Отметка времени модуля с ошибкой:   4c8d7577
  Код исключения:   c0000005
  Смещение исключения:   001aea99
  Версия ОС:   6.1.7600.2.0.0.768.11
  Код языка:   1049
  Дополнительные сведения 1:   0a9e
  Дополнительные сведения 2:   0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:   0a9e
  Дополнительные сведения 4:   0a9e372d3b4ad19135b953a78882e789

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

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

В приведенном коде пытаюсь даже не весь список обработать, а только хотя бы первый файл...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Ноябрь 10, 2010, 15:54 »

На какой из этих строк падает?
PreEdit pe(this, strLsFiles->at(0));
pe.start(QThread::IdlePriority);
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
UVV
Гость
« Ответ #7 : Ноябрь 10, 2010, 17:00 »

И правильно делает, что падает, поскольку объект PreEdit должен быть членом класса.
А так, как у тебя сейчас, оно просто уходит за пределы видимости.
Записан
akaMDA
Гость
« Ответ #8 : Ноябрь 10, 2010, 22:34 »

Да, все заработало.
Считывает отлично, но выводит в файл только при QThread::HighestPriority!!!
О_О

Это с чем связано?
« Последнее редактирование: Ноябрь 10, 2010, 22:47 от akaMDA » Записан
UVV
Гость
« Ответ #9 : Ноябрь 10, 2010, 23:36 »

А чего ты хотел добиться, указав QThread::IdlePriority?
Ты вообще assistant читал по этому поводу?
Не указывай никаких параметров просто.
Записан
akaMDA
Гость
« Ответ #10 : Ноябрь 10, 2010, 23:46 »

Вообще вот хотел спросить. Пишу щас дипломную работу по теме "Разработка программного комплекса класстеризации текстовой информации на основе нейронных сетей". Естественно в программе есть несколько независимых мест, выполнение которых можно распаралелить. Это например работа каждого нейрона, векторизация текста (это и есть его начало) и т.д. Так имеет ли смысл это превращать в отдельные потоки? Или в данном случае это бессмысленно?
Записан
UVV
Гость
« Ответ #11 : Ноябрь 10, 2010, 23:54 »

Про нейронные сети ничего не подскажу (не моя специализация), но распараллеливание на потоки может дать существенный прирост в производительности, когда оно правильно применено. В Qt есть несколько способов распараллелить задачу, потоки - не единственный.
Записан
akaMDA
Гость
« Ответ #12 : Ноябрь 11, 2010, 00:05 »

А какие еще способы в Qt есть?

просто я этой проблемой еще не сталкивался. Вот если все последовательно делать, то корость обработки 1 текста получется выше, чем если распараллелить. Прирост в скорости существенный я думаю будет уже при очень большом количестве входных текстов. А процессы даже QThread::HighestPriority, иногда вообще выпиливаются системой. Так например у меня получилось в какой-то момент времени, что 3 строчки просто перенос без разбора, комп 2 мин делал! Может есть способ в Qt сделать так, чтоб выполняемая задача была на критическом пути у системы и ее ничего не прерывало?
Записан
UVV
Гость
« Ответ #13 : Ноябрь 11, 2010, 00:08 »

QtConcurrent
Записан
BlackTass
Гость
« Ответ #14 : Ноябрь 11, 2010, 01:03 »

Конкаррент не поможет, там те же самые потоки, только обернутые в более простой синтаксис.

Чтобы ничего не прерывало средств не бывает. Пользуйтесь rtos, там возможностей в этом плане побольше.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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