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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: проблема с многопочностью  (Прочитано 11696 раз)
define
Гость
« : Июль 11, 2011, 16:42 »

Здравствуйте, пытаюсь разобраться с многопоточностью в Qt.
a.h
Код:
#include<b.h>

class a : public QWidget
{
    Q_OBJECT

public:
    a(QWidget *parent = 0);
private:
    void show(int pos);
   };
a.cpp
Код:
#include "a.h"
void a::show(int pos)
{
    th j;
    j.run(pos);
}
th.h
Код:
#include <QThread>
#include<a.h>

class th : public QThread
{
    Q_OBJECT
public:
    explicit th(QObject *parent = 0);
    void run(int h);

};
th.cpp
Код:
#include "th.h"

th::th(QObject *parent) :
    QThread(parent)
{
}
void th::run(int h)
{
 ...
}

так вот, почему поток в th идет не асинхронно?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июль 11, 2011, 17:00 »

Потому что:
1) надо перегружать виртуальную функцию run() без всяких параметров
2) запускаться надо при помощи start(), а не run.
Записан
define
Гость
« Ответ #2 : Июль 11, 2011, 17:07 »

Потому что:
1) надо перегружать виртуальную функцию run() без всяких параметров
2) запускаться надо при помощи start(), а не run.
ок, а как тогда передать в поток какой-либо параметр?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июль 11, 2011, 19:44 »

ок, а как тогда передать в поток какой-либо параметр?
Завести член класса соответствующего типа и записать в него нужные данные. Так же можно возвращать результат, если нужно.
Записан
define
Гость
« Ответ #4 : Июль 11, 2011, 21:41 »

Завести член класса соответствующего типа и записать в него нужные данные. Так же можно возвращать результат, если нужно.
можно какой-нибудь конкретный пример? Спасибо.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июль 11, 2011, 22:14 »

a.h
Цитировать
#include<b.h>

class a : public QWidget
{
    Q_OBJECT

public:
    a(QWidget *parent = 0);
private:
    void show(int pos);
   };
a.cpp
Цитировать
#include "a.h"
void a::show(int pos)
{
    th j;
   j.pos = pos;
    j.start();

}
th.h
Цитировать
#include <QThread>
#include<a.h>

class th : public QThread
{
    Q_OBJECT
public:
    explicit th(QObject *parent = 0);
   void run();
    int j;

};
th.cpp
Цитировать
#include "th.h"

th::th(QObject *parent) :
    QThread(parent)
{
}
void th::run()
{
 ...
}
Ну и наивно надеюсь, что вы просто для примера сократили, а в настоящем коде у вас классы не называются по 1-2 буквы.
« Последнее редактирование: Июль 12, 2011, 07:36 от LisandreL » Записан
define
Гость
« Ответ #6 : Июль 12, 2011, 10:42 »

Разумеется сократил)
Спасибо большое, вроде бы более менее с механизмом разобрался.
Записан
define
Гость
« Ответ #7 : Июль 12, 2011, 14:02 »

Цитировать
#include "a.h"
void a::show(int pos)
{
    th j;
   j.pos = pos;
    j.start();

}
вроде бы сделал, но пишет
"QThread: Destroyed while thread is still running"
в чем проблема может быть?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Июль 12, 2011, 14:45 »

Логично, как только выходите из функции поток разрушается.
Надо либо th создавать динамически, либо выходить из функции только после завершения потока.
Записан
danquimby
Гость
« Ответ #9 : Июль 22, 2011, 16:56 »

Цитировать
#include "a.h"
void a::show(int pos)
{
    th j;
   j.pos = pos;
    j.start();

}
вроде бы сделал, но пишет
"QThread: Destroyed while thread is still running"
в чем проблема может быть?

Код:
#include "a.h"
th *j;
void a::show(int pos)
{
    j = new th();
    j->pos = pos;
    j->start();
}
delete тока не забудь сделать где нить ) да и вообще странный подход )))
Записан
Странник
Гость
« Ответ #10 : Июль 22, 2011, 22:20 »

где-то мне попадалось замечание, что наследование QThread больше не является рекомендуемым методом работы с потоками. я использую следующий вариант и его вариации:
Код:
QThread thread;

Worker worker;
connect(obj, SIGNAL(workReady()), &worker, SLOT(doWork()));
worker.moveToThread(&thread);

thread.start();
вызов thread.start() инициирует запуск цикла обработки событий внутри созданного потока, соответственно слоты объекта worker выполняются в этом потоке при вызове через очередь. все объекты, живущие внутри потока, необходимо удалить до его завершения.
Записан
ilyagoo
Гость
« Ответ #11 : Июль 23, 2011, 18:37 »

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

не вспомнишь где? интересно почитать.
Записан
ufna
Гость
« Ответ #12 : Июль 24, 2011, 19:06 »


не вспомнишь где? интересно почитать.

попадалось на лабах троллей по-моему, но имхо это хрень полная
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #13 : Июль 25, 2011, 09:09 »

где-то мне попадалось замечание, что наследование QThread больше не является рекомендуемым методом работы с потоками.
не вспомнишь где? интересно почитать.
Было на данном форуме - поищи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #14 : Июль 25, 2011, 10:09 »

Тем не менее в справке приводится пример именно с переопределением run().
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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