• 5762阅读
  • 6回复

高手求助,QT多线程问题 [复制链接]

上一主题 下一主题
离线cszhoujin
 
只看楼主 倒序阅读 楼主  发表于: 2009-08-11
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
        我在编译QT2多线程的程序时出现如下错误
moc_ReceiveMovieThread.cpp: In member function `virtual void
   ReceiveMovieThread::initMetaObject()':
moc_ReceiveMovieThread.cpp:33: no method `QThread::className'
moc_ReceiveMovieThread.cpp: In static member function `static QMetaObject*
   ReceiveMovieThread::staticMetaObject()':
moc_ReceiveMovieThread.cpp:56: no method `QThread::staticMetaObject'
make: *** [moc_ReceiveMovieThread.o] Error 1

moc_ReceiveMovieThread.cpp:33:
if ( qstrcmp(QThread::className(), "QThread") != 0 )

moc_ReceiveMovieThread.cpp:56:
(void) QThread::staticMetaObject();

哪位高手能帮我看一下,到底是什么原因啊!
谢谢了!
离线shrek_mycpp
只看该作者 1楼 发表于: 2009-08-11
把你创建多线程相关源代码贴出来吧
离线80437
只看该作者 2楼 发表于: 2009-08-11
很可能是你的.h文件中的定义或写法有问题, 仔细检查一下
离线cszhoujin
只看该作者 3楼 发表于: 2009-08-12
头文件
#ifndef __RECEIVEMOVIETHREAD_H__
#define __RECEIVEMOVIETHREAD_H__

#include "StartCS.h"
#include <qthread.h>
#include <qwidget.h>
#include <qlineedit.h>
#include <qtextview.h>
#include <qsocket.h>


class ReceiveMovieThread: public QThread, public QWidget
{
    Q_OBJECT
    
public:
    ReceiveMovieThread(QWidget *parent, QLineEdit *LEip, QLineEdit *LEport, QTextView *TVinfo, MovieQueue *MQque);
    virtual void run();
    
private:
    MovieQueue *queueR;
    QLineEdit *ip;
    QLineEdit *port;
    QTextView *information;
    QSocket *socketMovie;
    
public slots:
    void connectToServer();
    void closeConnection();
    void sendToServer();
    
private slots:
    void socketReadyRead();
    void socketConnectionClosed();
    void socketClosed();
    void socketConnected();
    void socketError(int);
    void socketHostFound();
};

#endif

定义文件
#include "ReceiveMovieThread.h"
#include "stdio.h"

ReceiveMovieThread::ReceiveMovieThread(QWidget *parent, QLineEdit *LEip, QLineEdit *LEport, QTextView *TVinfo, MovieQueue *MQque):QWidget(parent)
{
    queueR = MQque;
    ip = LEip;
    port = LEport;
    information = TVinfo;
    socketMovie = new QSocket(this);
}

//connect to the server with the ip and the port
void ReceiveMovieThread::connectToServer()
{
    socketMovie->connectToHost(ip->text(), (port->text()).toInt());
    information->append(tr("Connect to the " + ip->text() + "...\n"));
}

//close the socket witch has connected
void ReceiveMovieThread::closeConnection()
{
    socketMovie->close();
    if(QSocket::Closing == socketMovie->state())
    {
        //if the socket is closing now, we should wait for closed state
        connect(socketMovie, SIGNAL(delayedCloseFinished()), SLOT(socketClosed()));
    }
    else
    {
        socketClosed();
    }
}

//send data to the server
void ReceiveMovieThread::sendToServer()
{
    
}

//have data from the server
void ReceiveMovieThread::socketReadyRead()
{
    information->append(tr("There is a note\n"));
}

//socket closed
void ReceiveMovieThread::socketClosed()
{
    information->append(tr("Connection closed\n"));
}

//socket closed by the server
void ReceiveMovieThread::socketConnectionClosed()
{
    information->append(tr("Connection closed by the server\n"));    
}

//find the host
void ReceiveMovieThread::socketHostFound()
{
    information->append(tr("Find the host" + ip->text() + "\n"));
}

//connected to the server
void ReceiveMovieThread::socketConnected()
{
    information->append(tr("Connected to the " + ip->text() + "ok!\n"));
}

//error operation
void ReceiveMovieThread::socketError(int err)
{
    if(err == QSocket::ErrConnectionRefused)
    {
        information->append(tr("Connect closed by server\n"));
    }
    else if(err == QSocket::ErrHostNotFound)
    {
        information->append(tr("Host Not Found\n"));
    }
    else if(err == QSocket::ErrSocketRead)
    {
        information->append(tr("Socket Read Error\n"));
    }
}

void ReceiveMovieThread::run()
{
    while(true)
    {
        printf("ReceiveMovieThread\n");
    }
}

生成的MOC文件
/****************************************************************************
** ReceiveMovieThread meta object code from reading C++ file 'ReceiveMovieThread.h'
**
** Created: Wed Aug 12 04:37:13 2009
**      by: The Qt MOC ($Id: qt/src/moc/moc.y   2.3.2   edited 2001-10-17 $)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#if !defined(Q_MOC_OUTPUT_REVISION)
#define Q_MOC_OUTPUT_REVISION 9
#elif Q_MOC_OUTPUT_REVISION != 9
#error "Moc format conflict - please regenerate all moc files"
#endif

#include "ReceiveMovieThread.h"
#include <qmetaobject.h>
#include <qapplication.h>



const char *ReceiveMovieThread::className() const
{
    return "ReceiveMovieThread";
}

QMetaObject *ReceiveMovieThread::metaObj = 0;

void ReceiveMovieThread::initMetaObject()
{
    if ( metaObj )
    return;
    if ( qstrcmp(QThread::className(), "QThread") != 0 ) ///////////////////////////33行
    badSuperclassWarning("ReceiveMovieThread","QThread");
    (void) staticMetaObject();
}

#ifndef QT_NO_TRANSLATION

QString ReceiveMovieThread::tr(const char* s)
{
    return qApp->translate( "ReceiveMovieThread", s, 0 );
}

QString ReceiveMovieThread::tr(const char* s, const char * c)
{
    return qApp->translate( "ReceiveMovieThread", s, c );
}

#endif // QT_NO_TRANSLATION

QMetaObject* ReceiveMovieThread::staticMetaObject()
{
    if ( metaObj )
    return metaObj;
    (void) QThread::staticMetaObject();///////////////////////////56行
#ifndef QT_NO_PROPERTIES
#endif // QT_NO_PROPERTIES
    typedef void (ReceiveMovieThread::*m1_t0)();
    typedef void (QObject::*om1_t0)();
    typedef void (ReceiveMovieThread::*m1_t1)();
    typedef void (QObject::*om1_t1)();
    typedef void (ReceiveMovieThread::*m1_t2)();
    typedef void (QObject::*om1_t2)();
    typedef void (ReceiveMovieThread::*m1_t3)();
    typedef void (QObject::*om1_t3)();
    typedef void (ReceiveMovieThread::*m1_t4)();
    typedef void (QObject::*om1_t4)();
    typedef void (ReceiveMovieThread::*m1_t5)();
    typedef void (QObject::*om1_t5)();
    typedef void (ReceiveMovieThread::*m1_t6)();
    typedef void (QObject::*om1_t6)();
    typedef void (ReceiveMovieThread::*m1_t7)(int);
    typedef void (QObject::*om1_t7)(int);
    typedef void (ReceiveMovieThread::*m1_t8)();
    typedef void (QObject::*om1_t8)();
    m1_t0 v1_0 = &ReceiveMovieThread::connectToServer;
    om1_t0 ov1_0 = (om1_t0)v1_0;
    m1_t1 v1_1 = &ReceiveMovieThread::closeConnection;
    om1_t1 ov1_1 = (om1_t1)v1_1;
    m1_t2 v1_2 = &ReceiveMovieThread::sendToServer;
    om1_t2 ov1_2 = (om1_t2)v1_2;
    m1_t3 v1_3 = &ReceiveMovieThread::socketReadyRead;
    om1_t3 ov1_3 = (om1_t3)v1_3;
    m1_t4 v1_4 = &ReceiveMovieThread::socketConnectionClosed;
    om1_t4 ov1_4 = (om1_t4)v1_4;
    m1_t5 v1_5 = &ReceiveMovieThread::socketClosed;
    om1_t5 ov1_5 = (om1_t5)v1_5;
    m1_t6 v1_6 = &ReceiveMovieThread::socketConnected;
    om1_t6 ov1_6 = (om1_t6)v1_6;
    m1_t7 v1_7 = &ReceiveMovieThread::socketError;
    om1_t7 ov1_7 = (om1_t7)v1_7;
    m1_t8 v1_8 = &ReceiveMovieThread::socketHostFound;
    om1_t8 ov1_8 = (om1_t8)v1_8;
    QMetaData *slot_tbl = QMetaObject::new_metadata(9);
    QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess(9);
    slot_tbl[0].name = "connectToServer()";
    slot_tbl[0].ptr = (QMember)ov1_0;
    slot_tbl_access[0] = QMetaData::Public;
    slot_tbl[1].name = "closeConnection()";
    slot_tbl[1].ptr = (QMember)ov1_1;
    slot_tbl_access[1] = QMetaData::Public;
    slot_tbl[2].name = "sendToServer()";
    slot_tbl[2].ptr = (QMember)ov1_2;
    slot_tbl_access[2] = QMetaData::Public;
    slot_tbl[3].name = "socketReadyRead()";
    slot_tbl[3].ptr = (QMember)ov1_3;
    slot_tbl_access[3] = QMetaData::Private;
    slot_tbl[4].name = "socketConnectionClosed()";
    slot_tbl[4].ptr = (QMember)ov1_4;
    slot_tbl_access[4] = QMetaData::Private;
    slot_tbl[5].name = "socketClosed()";
    slot_tbl[5].ptr = (QMember)ov1_5;
    slot_tbl_access[5] = QMetaData::Private;
    slot_tbl[6].name = "socketConnected()";
    slot_tbl[6].ptr = (QMember)ov1_6;
    slot_tbl_access[6] = QMetaData::Private;
    slot_tbl[7].name = "socketError(int)";
    slot_tbl[7].ptr = (QMember)ov1_7;
    slot_tbl_access[7] = QMetaData::Private;
    slot_tbl[8].name = "socketHostFound()";
    slot_tbl[8].ptr = (QMember)ov1_8;
    slot_tbl_access[8] = QMetaData::Private;
    metaObj = QMetaObject::new_metaobject(
    "ReceiveMovieThread", "QThread",
    slot_tbl, 9,
    0, 0,
#ifndef QT_NO_PROPERTIES
    0, 0,
    0, 0,
#endif // QT_NO_PROPERTIES
    0, 0 );
    metaObj->set_slot_access( slot_tbl_access );
#ifndef QT_NO_PROPERTIES
#endif // QT_NO_PROPERTIES
    return metaObj;
}


附件在下面希望高手帮我看一下
描述:ReceiveMovieThread.h
附件: ReceiveMovieThread.h (1 K) 下载次数:5
描述:ReceiveMovieThread.cpp
附件: ReceiveMovieThread.cpp (3 K) 下载次数:7
描述:moc_ReceiveMovieThread.cpp
附件: moc_ReceiveMovieThread.cpp (5 K) 下载次数:6
离线浪迹江湖

只看该作者 4楼 发表于: 2009-08-12
这种问题你可以试下:
make clean 后,再重新编译下
离线80437
只看该作者 5楼 发表于: 2009-08-12
我的印象中, 从两个QObject的子类继承会有问题, 不知道是不是这个原因.
建议分成两个类来写
离线cszhoujin
只看该作者 6楼 发表于: 2009-08-13
非常感谢大家的帮助!
问题已经解决了
我把类的声明
   class ReceiveMovieThread: public QThread, public QWidget
换成
   class ReceiveMovieThread: public QWidget, public QThread
就能编译通过了!
不知道这是为什么!!!
快速回复
限100 字节
 
上一个 下一个