Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Октябрь 04, 2012, 13:29



Название: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 13:29
Код
C++ (Qt)
#ifndef THEAD_H
#define THEAD_H
 
 
 
#include <QThread>
#include "progress_bar.h"
#include "mainwindow.h"
 
class XClientThread : public QThread
{
   Q_OBJECT
 
public:
   explicit XClientThread(QObject *parent=0);
   ~XClientThread();
   void run();
 
private:
   Progress_bar progress;
   MainWindow * mw;
   int i;
};
 
 
 
 
 
#endif // THEAD_H
 


Код
C++ (Qt)
#include "thead.h"
#include "mainwindow.h"
#include <QmessageBox>
#include <QDebug>
#include <QApplication>
#include "progress_bar.h"
#include "mainwindow.h"
 
XClientThread::XClientThread(QObject *parent) : QThread(parent)
{
   mw = (MainWindow*) parent;
 
   progress.show();
   start();
}
 
 
void XClientThread::run()
{
   i = 0;
   while (true)
   {
       mw->setWindowTitle(QString::number(i));
       i++;
   }
 
   exec();
}
 
XClientThread::~XClientThread(){
    progress.hide();
   exit();
   wait();
 
}
 




Название: Re: почему ошибка в потоке?
Отправлено: Пантер от Октябрь 04, 2012, 13:33
Нельзя из потока работать с гуи.


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 13:38
Вообще без вариантов?


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 13:42
Вообще без вариантов?
ага


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 13:44
Тогда там вообще потоки не нужны, вот говно а


Название: Re: почему ошибка в потоке?
Отправлено: Пантер от Октябрь 04, 2012, 13:45
Вообще без вариантов?
Сигналы/слоты.


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 13:46
Тогда там вообще потоки не нужны, вот говно а

Почему не нужны? Запрос на обновление гуя можно выбросить в основной поток и выполнить в нем


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:02
А как мне перенести экспорт QTableWidget в поток?


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:02
Сделать через model/view


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:09
Это как?????


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:16
http://doc.crossplatform.ru/qt/4.7.x/model-view-programming.html


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:18
уф... этого мне никогда не понять


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:19
уф... этого мне никогда не понять

Ну если прочитать весь этот текст за 2 минуты, то конечно не понять - читать надо хоть немного медленнее и вдумчивее


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:20
Ну я имею ввиду вобще не ясно как сделать прогрессбар в другом потоки и непонятно при чем тут  model/view
Хоть бы пример какой нибудь был


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:24
Ну я имею ввиду вобще не ясно как сделать прогрессбар в другом потоки и непонятно при чем тут  model/view
Хоть бы пример какой нибудь был

model/view не к прогрессбару относится, а к "перенести экспорт QTableWidget в поток"

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


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:24
Ну подскажи вообще как что, непонятно,


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:25
Вообще на WinAPI можно в потоках хоть новые окна создавать, а здесь не понять!


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:26
Берешь прогрессбар обычный, из своего потока высылаешь сигнал с новым значением для прогрессбара, в основном потоке ловишь этот сигнал и обновляешь значение прогрессбара


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:28
У прогрес бара бесконечность стоит.


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:29
У прогрес бара бесконечность стоит.

Что это за фраза и к чему она тут?


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:32
ui->progressBar->setRange(0,0);


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:33
ui->progressBar->setRange(0,0);

Так а зачем тогда прогрессбар трогать из другого потока вообще, раз он в бесконечность выставлен?


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:34
Потомучто не крутит! Не прорисовывается


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:36
Потомучто не крутит! Не прорисовывается

Ты код первого сообщения менял? Или на нем не крутит?



Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:38
И на нем не прорисовывается
И буз него, потомучто в главном потоке вычисления идут


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:40
Ну так вынеси вычисления в другой поток. Конечно ничего рисоваться не будет, если основной поток занят вычислениями


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:41
Так в другом потоке нельзя ActivX использовать


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:43
У тебя еще и ActiveX есть? А я об этом как должен догадаться? По невидимым строкам в твоих сообщениях?

Короче я умолкаю пока ты нормально вопрос или задачу не сформулируешь


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:45
Вопрос такой. У меня в главном потоке выполняется запрос ActiveX и еще к серверу.
Мне нужно чтобы во время долгих запросов В это время ProgressBar крутился.
Не используя элементы Gui невозможно делать эти вычисления. При том что ActivX обязательно используется


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:46
Что еще за сервер? Сетевой запрос?


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:47
В данный момент только ActivX
Нужно выполнять его и крутить прогресс бар, если найду такой способ то найду и для всего остольного


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:49
С ActivX не работал и в чем проблема работы с ним из потока не знаю


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:52
та же ошибка как и в первом посте который я дал
Тупо дальше вот этой строчки не идет
Код
C++ (Qt)
QAxWidget * application_ = new QAxWidget( "Excel.Application");


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:53
ладно, фиг с ним, пусть будет так, не кто в инете не нашел решение этой проблемы


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 04, 2012, 14:55
зависит от того, где эта строчка стоит


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 04, 2012, 14:58
Да даже просто обращение к Qtablewidget преводит к краху, а вычисления идут прям из него


Название: Re: почему ошибка в потоке?
Отправлено: V1KT0P от Октябрь 04, 2012, 21:25
Да даже просто обращение к Qtablewidget преводит к краху, а вычисления идут прям из него
Я же надеюсь что ты только из главного потока к нему обращаешься? А так минимальный нерабочий пример рулит.


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 05, 2012, 15:35
Вобщем сделал экспорт через буффер обмена.
И летает.



Но вот минимальный пример
Код
C++ (Qt)
       QAxObject* WordApplication=new QAxObject("Word.Application"); // Создаю интерфейс к MSWord
 
        WordApplication->setProperty("Visible", false); // Делаю его невидимым
       QApplication::processEvents();
       QAxObject* WordDocuments = WordApplication->querySubObject( "Documents()" ); // Получаю интерфейсы к его подобъекту "коллекция открытых документов":
       WordDocuments->querySubObject( "Add()" ); // Создаю новый документ
 
       QAxObject* ActiveDocument = WordApplication->querySubObject("ActiveDocument()");
 
       // создание таблицы
       QAxObject* Tables = ActiveDocument->querySubObject("Tables()");
 
 
       QApplication::processEvents();
 
       int r,c;
       if (startRow==0) r = table->rowCount(); else r =table->rowCount()-1;
       if (StartColumn==0) c = table->columnCount(); else c =table->columnCount()-1;
       QAxObject* NewTable = Tables->querySubObject("Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior)", ActiveDocument->dynamicCall("Range()"), r,  c, 1, 1);
 
       for (int i=startRow; i < table->rowCount(); i++){
           for (int j=StartColumn; j < table->columnCount(); j++){
 
               int i1,j1;
               if (startRow==0) i1 = i+1; else i1 =i;
               if (StartColumn==0) j1 = j+1; else j1 =j;
               // запись текста в ячейку
 
               QAxObject* Cell = NewTable->querySubObject("Cell(Row, Column)", i1, j1);
               if( !Cell ) {
                   QMessageBox::information(0,QString::number(i)+" - "+QString::number(j),"cell");
                   return;
               }
               QAxObject* CellRange = Cell->querySubObject("Range()");
 
 
               QString data = table->item(i,j)->text();
 
               // вставка значения переменной data (любой тип, приводимый к QVariant) в полученную ячейку
               CellRange->dynamicCall("InsertAfter(Text)", data);
 
               // освобождение памяти
               delete CellRange;
               delete Cell;
 
           }
       }
 
               ActiveDocument->dynamicCall("SaveAs(const QVariant&)",QVariant(exportname.replace("/","\\")));
 
 
               WordApplication->dynamicCall("Close (Boolean)", FALSE);
               WordApplication->dynamicCall("Quit()");
 
 
 
               delete NewTable;
               delete Tables;
               delete ActiveDocument;
               delete WordDocuments;
               delete WordApplication;


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 05, 2012, 15:52
А зачем в примере периодически QApplication::processEvents(); ?


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 05, 2012, 15:59
Ну, можно удалить, это чтобы прогресбар крутился.


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 05, 2012, 16:00
Ну в потоке его нету.
Всеравно к любому виджету обращения и хряц


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 05, 2012, 16:01
Код
C++ (Qt)
       for (int i=startRow; i < table->rowCount(); i++){
           for (int j=StartColumn; j < table->columnCount(); j++){
 
               int i1,j1;
               if (startRow==0) i1 = i+1; else i1 =i;
               if (StartColumn==0) j1 = j+1; else j1 =j;
               // запись текста в ячейку
 
               QAxObject* Cell = NewTable->querySubObject("Cell(Row, Column)", i1, j1);
               if( !Cell ) {
                   QMessageBox::information(0,QString::number(i)+" - "+QString::number(j),"cell");
                   return;
               }
               QAxObject* CellRange = Cell->querySubObject("Range()");
 
 
               QString data = table->item(i,j)->text();
 
               // вставка значения переменной data (любой тип, приводимый к QVariant) в полученную ячейку
               CellRange->dynamicCall("InsertAfter(Text)", data);
 
               // освобождение памяти
               delete CellRange;
               delete Cell;
 
           }
       }


Название: Re: почему ошибка в потоке?
Отправлено: mutineer от Октябрь 05, 2012, 16:02
Ну, можно удалить, это чтобы прогресбар крутился.


А по какой логике он стоит не в самом долгом месте - в цикле - а в каких-то случайных точках?


Название: Re: почему ошибка в потоке?
Отправлено: CJ1 от Октябрь 05, 2012, 22:16
Цитировать
А по какой логике он стоит не в самом долгом месте - в цикле - а в каких-то случайных точках?

Я уже не помню, там тоже были помойму циклы, но я уже это все удалил, а про этот забыл.
Ну здесь незачем парится