доступ к данным потока

 
0
 
C++
ava
gordmiand | 12.11.2010, 22:30
сразу прямо в main-е запускаю поток (так надо):

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "my_thr.h"


    my_thr *potok;


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    potok = new my_thr();
    potok->start(QThread::TimeCriticalPriority);

    w.show();
    return a.exec();
}

//////////////////////////////////////////////////////////////
#include <QThread>


class my_thr : public QThread
{
     Q_OBJECT
public:
    my_thr();
    void run();

    int per1;
    short mas[100];
};
/////////////////////////////////////////////////////////////
#include "my_thr.h"
#include <QDebug>

my_thr::my_thr()
{      }


void my_thr::run()
{
    qDebug() << "Hello";
}
  
а как мне обеспечить возможность доступа к членам (per1, mas[]) класса my_thr из других, например из mainwindow.cpp, модулей программы? подскажите пож-та ны вышеуказанном примере...
Ответы (2)
ava
null56 | 13.11.2010, 01:58 #
Цитата (gordmiand @  12.11.2010,  22:30 findReferencedText)
а как мне обеспечить возможность доступа к членам (per1, mas[]) класса my_thr из других, например из mainwindow.cpp, модулей программы? подскажите пож-та ны вышеуказанном примере... 

если я правильно понял, вопрос про организацию кода программы? если да, тогда, как вариант (!!!), можно хранить ссылку(или указатель) на объект класса my_thr внутри класса mainwindow
Шаги:
1) подключи файл my_thr.h в заголовке mainwindow.h

// файл mainwindow.h
#include "my_thr.h"


2) создай ссылку или указатель, в переменных - членах класса MainWindow,  на объект класса my_thr, инициализируй ее в конструкторе

class MainWindow
{
public:
    // конструктор - инициализирует переменную член класса m_MyThread - теперь у тебя есть доступ к объекту, а вместе с ним и к его переменным
   MainWindow(my_thr * thread = 0) : m_MyThread(thread)

private:
   //переменная член на твой поток
  my_thr * m_MyThread;
};


Другие варианты:
- сделать объект класса my_thread статическим (не есть хорошо), как вариант синглтон, и обращаться к нему через статические методы. в этом случае не придется изменять конструктор MainWindow и lдобавлять туда переменные, но возникает сложность следить за завершением потока и синхронизацией данных, учитывая, что у тебя там не все атомарные типы (short [])
- делать общие переменные внутри класса my_thr, то есть сам класс может быть создан внутри стека, но работает он с какими  - то глобальными данными... в этом случае возникает сложность синхронизации этих данных,

ну это, что пришло на ум.... я бы наверное сделал через синглон, тогда поток был бы общим для всех классов приложения, запуск и завершение потока я бы вынес в конструктор и деструктор основного окна приложения соотвественно

как - то так... ЭТО если я правильно понял, то чего ты спрашиваешь
ava
SABROG | 13.11.2010, 09:34 #
Если нужно обработать данные в потоке и вернуть результат в класс виджета, то лучше посмотреть в сторону QtConcurrent, в класс MainWindow добавить QFutureWatcher и результаты брать у него, когда придет сигнал о завершении операции потока.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить