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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Опять потоки!  (Прочитано 26538 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Июнь 04, 2009, 20:43 »

Доброго времени суток...

Столкнулся с проблемой:
мне нужно чтобы метод класса execMethod(), вызванный из основного потока приложения выподнился в другом потоке Улыбающийся
код tc.h
Код:
#ifndef TC_H
#define TC_H

#include <QThread>
#include <QDebug>

class ThreadClass : public QThread
{
public:
ThreadClass(QObject *parent = 0) : QThread(parent) { }
void execMethod() {
qDebug() << "ThreadClass->execMethod()-> ID = " << QThread::currentThreadId();
}
protected:
void run() {
qDebug() << "ThreadClass->run()-> ID = " << QThread::currentThreadId();
exec();
qDebug() << "After Exec";
}
};

#endif

код main.cpp
Код:
#include <QtCore>
#include <tc.h>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
qDebug() << "QCoreApplication -> ID = " << QThread::currentThreadId();
ThreadClass *tc = new ThreadClass();
tc->moveToThread(tc);
tc->start();
sleep(1);
tc->execMethod();
       return app.exec();
}

вот что выводит:
Цитировать
[den@myhost thread_run]$ release/test
QCoreApplication -> ID =  140163681347328
ThreadClass->run()-> ID =  1115613520
ThreadClass->execMethod()-> ID =  140163681347328

а мне нужно чтобы получилось ThreadClass->execMethod()-> ID =  1115613520   !!!

Это реально сделать? Или я требую невозможного?

Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #1 : Июнь 04, 2009, 20:53 »

В контексте другого потока будет выполняться все, что находиться в методе run() и после завершения этого метода нить умрет. Если execMethod вызвать из run, то он будет выполнен в контексте нити.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Июнь 04, 2009, 21:40 »

блина, только через сигналы работает:

tc.h
Код:
#ifndef TC_H
#define TC_H

#include <QThread>
#include <QDebug>

class PrintClass : public QObject
{
Q_OBJECT
public:
PrintClass() {}
virtual ~PrintClass() {}
public slots:
void printMsg() { qDebug() << "PrintClass->printMsg()-> ID = " << QThread::currentThreadId(); }
};

class ThreadClass : public QThread
{
Q_OBJECT
public:
ThreadClass() {}
virtual ~ThreadClass() {}
void execMethod() {
qDebug() << "ThreadClass->execMethod()-> ID = " << QThread::currentThreadId();
emit sigExec();
}
protected:
void run() {
qDebug() << "ThreadClass->run()-> ID = " << QThread::currentThreadId();
pc = new PrintClass();
connect(this, SIGNAL(sigExec()), pc, SLOT(printMsg()));
exec();
qDebug() << "After Exec";
}
signals:
void sigExec();
private:
PrintClass *pc;
};
#endif

main.cpp
Код:
#include <QtCore>
#include "tc.h"
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
qDebug() << "QCoreApplication -> ID = " << QThread::currentThreadId();
ThreadClass *tc = new ThreadClass();
tc->start();
sleep(1);
tc->execMethod();
    return app.exec();
}

выдало:
Цитировать
[den@myhost thread_run]$ release/test
QCoreApplication -> ID =  140552331060992
ThreadClass->run()-> ID =  1110485328
ThreadClass->execMethod()-> ID =  140552331060992
PrintClass->printMsg()-> ID =  1110485328

уфффффф
Записан

ArchLinux x86_64 / Win10 64 bit
ритт
Гость
« Ответ #3 : Июнь 04, 2009, 23:05 »

а что, tc->execMethod() когда-нибудь где-нибудь выполнился бы в другом потоке?)
налицо пробел в понимании многопотокового программирования...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Июнь 05, 2009, 07:21 »

Цитировать
а что, tc->execMethod() когда-нибудь где-нибудь выполнился бы в другом потоке?)
налицо пробел в понимании многопотокового программирования...

Не поверите! Я по этому поводу ни сколько не переживаю ! Улыбающийся

Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Июнь 05, 2009, 08:08 »

и даже так работает:

tc.h
Код:
#ifndef TC_H
#define TC_H
#include <QThread>
#include <QDebug>
class ThreadClass : public QThread
{
Q_OBJECT
public:
ThreadClass() {}
virtual ~ThreadClass() {}
void execMethod() {
qDebug() << "ThreadClass->execMethod()-> ID = " << QThread::currentThreadId();
emit sigExec();
}
protected:
void run() {
qDebug() << "ThreadClass->run()-> ID = " << QThread::currentThreadId();
connect(this, SIGNAL(sigExec()), this, SLOT(printMsg()));
exec();
qDebug() << "After Exec";
}
signals:
void sigExec();
private slots:
void printMsg() { qDebug() << "ThreadClass->printMsg()-> ID = " << QThread::currentThreadId(); }
};
#endif

main.cpp
Код:
#include <QtCore>
#include <QtTest/QtTest>
#include "tc.h"
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
qDebug() << "QCoreApplication -> ID = " << QThread::currentThreadId();
ThreadClass *tc = new ThreadClass();
tc->moveToThread(tc);  // <---- ВОТ БЕЗ ЭТОГО НЕ ПРАВИЛЬНО РАБОТАЕТ
tc->start();
QTest::qSleep(250);
tc->execMethod();
    return app.exec();
}

вывод:
Цитировать
D:\projects\thread_run2>release\test.ex
QCoreApplication -> ID =  0x7d0
ThreadClass->run()-> ID =  0x358
ThreadClass->execMethod()-> ID =  0x7d0
ThreadClass->printMsg()-> ID =  0x358

удивидельно! Улыбающийся
« Последнее редактирование: Июнь 05, 2009, 08:13 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #6 : Июнь 05, 2009, 08:26 »

удивидельно! Улыбающийся
А почему удивительно?  Подмигивающий
printMsg вызывается из run, соответственно в контексте нити.
Записан
ритт
Гость
« Ответ #7 : Июнь 05, 2009, 10:58 »

собсна, вообще не удивительно.
а вот tc->moveToThread(tc) улыбнуло...ассоциируется с картинкой, где чел сам себе в зад залазит /* может видел кто? */ Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Июнь 05, 2009, 12:27 »

А я так и непонял, с какой целью вызывается tc->execMethod() в main о_О
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #9 : Июнь 05, 2009, 12:39 »

ну, это как синглШот...только без синглШот-а Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Июнь 05, 2009, 14:11 »

Цитировать
собсна, вообще не удивительно.
а вот tc->moveToThread(tc) улыбнуло...ассоциируется с картинкой, где чел сам себе в зад залазит /* может видел кто? */ Улыбающийся

ну а как иначе то? И кстати я тут на форуме видел что именно так люди делают Улыбающийся

Цитировать
А я так и непонял, с какой целью вызывается tc->execMethod() в main о_О

Ну дык можно и не в main... это просто тестовый вариант программки... Или вы о чем?

А вообще планы у меня глобального характера!! Как бы все сделать бы (осилить)  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

Ну дык можно и не в main... это просто тестовый вариант программки... Или вы о чем?

Процетирую Константина:

Цитировать
а что, tc->execMethod() когда-нибудь где-нибудь выполнился бы в другом потоке?)
Записан

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

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Июнь 05, 2009, 14:25 »

Цитировать
Ну дык можно и не в main... это просто тестовый вариант программки... Или вы о чем?

Процетирую Константина:

Цитировать
а что, tc->execMethod() когда-нибудь где-нибудь выполнился бы в другом потоке?)

ДА!!! если в последнем варианте убрать tc->moveToThread(tc) - то выполнится в главном потоке QApplication ... если добавить - то в дочернем потоке tc
Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #13 : Июнь 05, 2009, 15:27 »

ну а как иначе то?

Как иначе? Вызвать execMethod в run

И кстати я тут на форуме видел что именно так люди делают Улыбающийся

За сколько лет на форуме я невидел такой вот реализации:

tc->moveToThread(tc)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
SASA
Гость
« Ответ #14 : Июнь 05, 2009, 15:41 »

Код:
void execMethod() {}
QFuture<void> QtConcurrent::run (execMethod)
И вот тебе функция в отдельном потоке...
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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