2013-03-06 3 views
0

Я подклассифицировал мой Qthread, поэтому я могу реализовать свой код в методе run(). Мне нужно передать некоторые параметры,Передача аргументов методу run() QThread

Я пробовал это так, так что здесь не так?

class QMyThread : 
    public QThread 
{ 
public: 
    QMyThread(); 
    ~QMyThread(void); 
    virtual void start(FILE *data, int sock, int bits); 

protected: 
    virtual void run(FILE *data, int sock, int bits); 
}; 

run method;

void QMyThread::run(FILE *data, int sock, int bits) 
{ 
//do stuff 
} 

запустить поток:

QMyThread *thread; 
thread->start(datafile, sockint, bitsint); 

первого он говорит, что поток не может быть инициализирован, а затем он выходит из строя в start() методе с SIGSEGV error. Кто-нибудь может мне помочь?

ответ

3

Вы не должны подклассифицировать класс QThread, поскольку это больше не рекомендуется использовать QThread.

Для получения дополнительной информации http://qt-project.org/doc/qt-4.8/qthread.html

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

+0

ok, без подкласса QThread, как добавить параметры в функцию dowork()? и как получить некоторые значения от функции dowork до потока gui? – SamuelNLP

+1

@SamuelNLP - вы можете передать данные своему рабочему объекту через конструктор или некоторый метод инициализации. – dtech

+0

Я пробовал вот так: «Worker * worker = new Worker (sock, bits);' – SamuelNLP

1

Вы должны сделать это вместо того, чтобы:

QMyThread thread; 
thread.start(...) 

Вы создали указатель на поток и не new его. Я откровенно не вижу причины для указателя здесь, вы можете просто создать нормальную переменную и вызвать метод на ней.

Если вы хотите указатель, а затем использовать std::unique_ptr в C++ 11 или boost::unique_ptr

std::unique_ptr<QMyThread> thread; 
thread->start(...); 

EDIT:

Вы должны действительно просто создать QThread * thread = new QThread(this); согласно documentation.

+0

без указателя Я получаю 'ошибка: неопределенная ссылка на' QMyThread :: QMyThread() '' – SamuelNLP

+0

@SamuelNLP правильно ли вы определили все функции-члены, ctor/dtor и включили ли вы заголовок в файл cpp? –

+0

@TonyTheLion 'QThread', безусловно, имеет виртуальный конструктор, унаследованный от базового класса' QObject'. Qt на самом деле не пытается использовать указатели больше, чем в другом месте, т. Е. Если вы хотите, чтобы объект длился дольше, чем текущая область. Однако это обычная практика с QObjects, поскольку Qt выполняет большую автоматическую очистку через механизм удаления родительского/дочернего элементов. –

Смежные вопросы