2015-12-15 65 views
1

我正在写服务器是多线程的客户端服务器程序,我想用while()在我的线程中创建循环,但它在myhthread.cpp中得到以下错误: “之前‘ID’预期‘)’”我知道我的问题是基本的,但我真的很困惑......我怎么能为它创建循环这里是我的代码:?错误:'ID'之前'''

mythread.h

#ifndef MYTHREAD_H 
#define MYTHREAD_H 
#include <QThread> 
#include <QMainWindow> 
#include <QTcpServer> 
#include <QTcpSocket> 
#include "myserver.h" 
#include <QDebug> 

class mythread : public QThread 
{ 
Q_OBJECT 

public: 

mythread(qintptr ID, QObject *parent) : 

    QThread(parent) 
{ 
    this->socketDescriptor = ID; 
} 

    void run() 
    { 
     qDebug() << " Thread started"; 

     socket = new QTcpSocket(); 

     if(!socket->setSocketDescriptor(this->socketDescriptor)) 
      { 
       emit error(socket->error()); 
       return; 
      } 

//  if (m_client) 


     connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::DirectConnection); 

     connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); 


     qDebug() << socketDescriptor << " Client connected"; 

     exec(); 
    } 

signals: 

void error(QTcpSocket::SocketError socketerror); 

public slots: 

void readyRead(); 
void disconnected(); 

private: 

QTcpSocket* socket; 
qintptr socketDescriptor; 

}; 

#endif 

mythread.cpp:

#include "mythread.h" 
#include "myserver.h" 


mythread(qintptr ID, QObject *parent) : 
{ 
    while(disconnected) 
    { 
     mythread::run(); 
    } 
} 

void mythread::readyRead() 

{ 

QByteArray Data = socket->readAll(); 

qDebug()<< " Data in: " << Data; 

socket->write(Data); 
} 


void mythread::disconnected() 

{ 

qDebug() << " Disconnected"; 

socket->deleteLater(); 

exit(0); 

} 
在CPP你的构造函数的定义210
+0

即使offtopic,但它也可能是http://blog.qt.io/blog/2010/06/17 /你做错了/适合你。 'QTcpSocket'是默认的异步,所以为什么把它放在一个线程中(你在做它?) – Zaiborg

回答

1

使用范围解析,并获得该行的末尾摆脱:的:

mythread::mythread(qintptr ID, QObject *parent) // : 
{ 
    ... 
} 

没有mythread::前缀,编译器明白你想声明一些对象的类型为mythread,并且语法混淆。

编辑:正如Danh指出的,一旦你纠正了错误,编译器会提醒你注意你有两个相同构造函数的定义,这是非法的。

可能的更正:您应该从所有函数实现中清除头中的类声明,并将实现移至cpp文件。正如你所构造的两种不同的实现,你可以尝试合并两种:

//in the header: no implementation of functions 
class mythread : public QThread 
{ 
    ... 
    mythread(qintptr ID, QObject *parent); 
    void run(); 
    ... 
}; 

// in the cpp 
mythread(qintptr ID, QObject *parent) 
    : QThread(parent) 
{ 
    this->socketDescriptor = ID; 
    while(disconnected) // if you really want to do this during the construction 
    { 
     mythread::run(); 
    } 
} 

void mythread::run() 
{ 
    ... 
} 
+1

实际上,他定义了2个定义mythread :: mythread(qintptr ID,QObject * parent)'我猜他会回来了新的错误。 – Danh

+0

@Danh好点!一旦错误得到纠正,他会得到一个关于重新定义的明确错误消息。 – Christophe

+0

是的,你猜对了.. 请问我该怎么办? – Hanita