2013-03-06 5668 views
0

我已经将我的Qthread子类化了,因此我可以在run()方法中实现我的代码。我必须通过它一些参数,将参数传递给QThread的run()方法

我试过这样,所以这里有什么问题?

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); 
}; 

运行方法;

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

好吧,没有子类的QThread我怎么可以添加参数dowork()函数?以及如何从dowork函数获取一些值到gui线程? – SamuelNLP 2013-03-06 16:20:09

+1

@SamuelNLP - 您可以通过构造函数或某种初始化方法将数据传递给工作对象。 – dtech 2013-03-06 16:54:21

+0

我试过这样,'Worker * worker = new Worker(sock,bits);' – SamuelNLP 2013-03-06 17:05:37

1

你应该这样做,而不是:

QMyThread thread; 
thread.start(...) 

您创建了一个指向线程并没有new它。我坦率地看到这里没有指针的原因,你可以创建一个普通变量并调用一个方法。

如果你想有一个指针,然后在C++ 11或boost::unique_ptr

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

编辑使用std::unique_ptr

你真的应该只需要创建一个QThread * thread = new QThread(this);按照该documentation

+0

没有指针我会得到错误:未定义的引用QMyThread :: QMyThread() – SamuelNLP 2013-03-06 16:02:58

+0

@SamuelNLP你有没有定义所有的成员函数,ctor/dtor正确,你有没有在cpp文件中包含头文件? – 2013-03-06 16:06:20

+0

@TonyTheLion'QThread'肯定有一个从'QObject'基类继承的虚拟构造函数。 Qt并没有真正强迫你使用指针,而不是你在其他地方使用指针,即如果你想让一个对象比当前作用域更长。然而,QObject常见的做法是,Qt通过父/子删除机制进行大量自动清理。 – 2013-03-06 16:17:38