Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > доступ к данным потока


Автор: 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, модулей программы? подскажите пож-та ны вышеуказанном примере... 

Автор: null56 13.11.2010, 01:58
Цитата(gordmiand @  12.11.2010,  22:30 Найти цитируемый пост)
а как мне обеспечить возможность доступа к членам (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, то есть сам класс может быть создан внутри стека, но работает он с какими  - то глобальными данными... в этом случае возникает сложность синхронизации этих данных,

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

как - то так... ЭТО если я правильно понял, то чего ты спрашиваешь

Автор: SABROG 13.11.2010, 09:34
Если нужно обработать данные в потоке и вернуть результат в класс виджета, то лучше посмотреть в сторону QtConcurrent, в класс MainWindow добавить QFutureWatcher и результаты брать у него, когда придет сигнал о завершении операции потока.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)