1

我已经对我的 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。任何人都可以帮助我吗?

4

3 回答 3

4

您不应该继承 QThread 类,因为这不再是使用 QThread 的推荐方式。

更多信息http://qt-project.org/doc/qt-4.8/qthread.html

要回答你的问题,你不能让这些参数成为你的类的成员并通过设置器或其构造器分配它们的值吗?

于 2013-03-06T16:06:57.190 回答
1

你应该这样做:

QMyThread thread;
thread.start(...)

您创建了一个指向线程的指针,但没有创建new它。坦率地说,我在这里没有理由使用指针,您可以创建一个普通变量并在其上调用一个方法。

如果您确实需要指针,请std::unique_ptr在 C++11 或boost::unique_ptr

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

编辑:

你真的应该QThread * thread = new QThread(this);按照文档创建一个。

于 2013-03-06T15:59:03.613 回答
0

如何使用QMetaObject该类将参数传递给工人类。你可以这样尝试:

QMetaObject::invokeMethod(worker, "methodName", Q_ARG(QString, "ParameterQStringValue");

methodName请注意,如果是插槽并且您使用创建线程的新方法,则此方法将起作用: https ://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full -解释/

Q_ARG您可以使用最多 9 个宏(http://doc.qt.io/qt-5/qmetaobject.html#details )指定不同的参数。如果您需要更多参数,那么我建议您QVector使用结构创建并将其QMetaObject::invokeMethod作为参数传递给。

于 2018-10-02T21:55:16.900 回答