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

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Трудоемкие задачи (прервать или продолжить). Как прервать?  (Прочитано 32548 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Декабрь 06, 2009, 21:31 »

дело ведь не в заполнении таблицы, а также в копировании, вставке, вырезать, сортировка- вариант с тремя кнопками обопщение
Значит во всех этих случаях надо использовать один прием, который я Вам покажу завтра (сейчас мне надо уходить) если буду иметь любую из Ваших долгих ф-ций.
Записан
daimon
Гость
« Ответ #16 : Декабрь 06, 2009, 22:04 »

class for_a:public QThread
{Q_OBJECT
signals: void finished();
public:
   void run()
   {
      int b=0;
      for(int i=0; i<10;i++)
         b++;
      emit finished();
      exec();
   }
};
Как сделать чтобы этот поток разрушался сам после завершения работы функции run()?
Записан
daimon
Гость
« Ответ #17 : Декабрь 06, 2009, 23:42 »

Код:
#ifndef THREAD_H
#define THREAD_H

#include <QWidget>
#include "ui_thread.h"
#include <QThread>
#include <QProgressDialog>

class for_a:public QThread
{
public:
void run()
{
setObjectName("for_a");

int b=0;
for(int i=0; i<1000000000;i++)
{b++;}

}
};

class for_b:public QThread
{

public:
void run()
{

setObjectName("for_b");

int b=0;
for(int i=0; i<1000000000;i++)
{b++;}

}

};

class for_c:public QThread
{
public:
void run()
{
             setObjectName("for_c");

           int b=0;
for(int i=0; i<1000000000;i++)
{b++;}

}
};

using namespace Ui;

class thread : public QWidget, public Form
{
Q_OBJECT

public:
for_a th_a;
for_b th_b;
for_c th_c;
QThread *id;
thread(QWidget *parent = 0);
~thread();
public slots:
void slot_a();
void slot_b();
void slot_c();

};

#endif // THREAD_H




#include "thread.h"

thread::thread(QWidget *parent)
: QWidget(parent)
{
setupUi(this);
connect(p_b,SIGNAL(clicked()),SLOT(slot_b()));
connect(p_a,SIGNAL(clicked()),SLOT(slot_a()));
connect(p_c,SIGNAL(clicked()),SLOT(slot_c()));
id=NULL;
}

thread::~thread()
{

}
void thread::slot_a()
{
if(id==NULL)
{
id=&th_a;
th_a.start();

setWindowTitle("ok_a id=NULL");
}
else if(id->isFinished())
{
id=&th_a;
th_a.start();

setWindowTitle("ok_a");

}

else setWindowTitle(id->objectName()+" is working");
}
void thread::slot_b()
{
if(id==NULL)
{
id=&th_b;
th_b.start();

setWindowTitle("ok_b id=NULL");
}
else if(id->isFinished())
{

id=&th_b;
th_b.start();

setWindowTitle("ok_b");
}

else setWindowTitle(id->objectName()+" is working");
}
void thread::slot_c()
{
if(id==NULL)
{

id=&th_c;
th_c.start();

          setWindowTitle("ok_c id=NULL");

}
else if(id->isFinished())
{

id=&th_c;
th_c.start();

setWindowTitle("ok_c");

}

else setWindowTitle(id->objectName()+" is working");
}


#include <QtGui/QApplication>
#include "thread.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
thread w;
w.show();
return a.exec();
}
Можна как нибудь оптимизировать код (условия проверки id, если объединить на первом клике мышкой на кнопке происходит ошибка - id=NULL)
« Последнее редактирование: Декабрь 07, 2009, 00:01 от daimon » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #18 : Декабрь 06, 2009, 23:51 »

2 daimon: Зачем ты объявляешь сигнал finished в своих потоках? Этот сингал уже есть:

Цитировать
void QThread::finished ()   [signal]
This signal is emitted when the thread has finished executing.

И ненужно самому его испускать
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
daimon
Гость
« Ответ #19 : Декабрь 07, 2009, 00:00 »

2 daimon: Зачем ты объявляешь сигнал finished в своих потоках? Этот сингал уже есть:

Цитировать
void QThread::finished ()   [signal]
This signal is emitted when the thread has finished executing.

И ненужно самому его испускать
Спасибо исправил, а как быть с проверкой id на первом клике мышкой
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #20 : Декабрь 07, 2009, 00:06 »

Первый клик мышки куда? Чесно сказать непонятно, что ты хочешь
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spectre71
Гость
« Ответ #21 : Декабрь 07, 2009, 00:09 »

Как сделать чтобы этот поток разрушался сам после завершения работы функции run()?

Цитировать
class MyThread : public QThread {
    Q_OBJECT
  protected:
    MyThread(bool FreeOnComplete = false, QObject * parent = 0);
};

MyThread::MyThread(bool FreeOnComplete, QObject* parent) : QThread(parent) {
  if(FreeOnComplete) {connect(this , SIGNAL(finished()), this , SLOT(deleteLater()));}
}

Записан
daimon
Гость
« Ответ #22 : Декабрь 07, 2009, 00:19 »

Первый клик мышки куда? Чесно сказать непонятно, что ты хочешь
Первый клик на любую из кнопок (и сразу ошибка) - хочу реализовать простой пимер, когда поток начинает работать после того как другой закончил и не иначе.
ошибка
Код:
           if(id==NULL || id->isFinished())
{
id=&th_a;
th_a.start();

setWindowTitle("ok_a");
}
else setWindowTitle(id->objectName()+" is working");
нет ошибки
Код:
     if(id==NULL)
{
id=&th_a;
th_a.start();

setWindowTitle("ok_a id=NULL");
}
else if(id->isFinished())
{
id=&th_a;
th_a.start();

setWindowTitle("ok_a");
}
else setWindowTitle(id->objectName()+" is working");
Последняя реализация кода просто дублируется. Как записать правильно условие?
Проблема id=NULL при запуске и id-isFinished() тогда возвращает ошибку
Может использовать синхронизацию мютексы и семофоры?Непонимающий?
Помогите В замешательстве
« Последнее редактирование: Декабрь 07, 2009, 00:54 от daimon » Записан
daimon
Гость
« Ответ #23 : Декабрь 07, 2009, 00:59 »

Как в потоке отобразить QMessageBox (любой виджет)?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #24 : Декабрь 07, 2009, 01:00 »

Как в потоке отобразить QMessageBox (любой виджет)?

Никак, это запрещено.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #25 : Декабрь 07, 2009, 01:02 »

Первый клик на любую из кнопок (и сразу ошибка)

Какая ошибка?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
daimon
Гость
« Ответ #26 : Декабрь 07, 2009, 01:08 »

Первый клик на любую из кнопок (и сразу ошибка)

Какая ошибка?
Ошибка пропала, пока ошибок нет
« Последнее редактирование: Декабрь 07, 2009, 01:41 от daimon » Записан
daimon
Гость
« Ответ #27 : Декабрь 07, 2009, 01:22 »

Есть функция с виджетами (spreadsheet).
Как узнать работает ли она сейчас и прервать её работу?
Думал потоками - так нельзя виджетов
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #28 : Декабрь 07, 2009, 04:22 »

>>Как сделать чтобы этот поток разрушался сам после завершения работы функции run()?
тут есть момент который нельзя упускать из виду.

посмотри внимательно на функцию main, твоего приложения, как она выполняется. Выходит ли программа из main'а?
если в этой функции вызывается QApplication::exec(), то программа зацикливается внутри него.
Это как раз обработчик событий извне приложения (перетаскивание, щёлканье мышкой по виджетам, ...)
Аналогичная функция есть и у QThread. Если внутри потока ненужно обрабатывать события извне, то можно не вызывать эту функцию. Тем более, что у тебя вся полезная работа выполняется до вызова этой функции.
Записан

Юра.
daimon
Гость
« Ответ #29 : Декабрь 07, 2009, 09:26 »

А как быть с функциями (слотами) где есть виджеты - их в поток не загонишь (или созжать потоки с синхронизацией с главным потоком)Непонимающий??
« Последнее редактирование: Декабрь 10, 2009, 01:33 от daimon » Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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