Russian Qt Forum
Ноябрь 22, 2024, 06:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Предупреждение в консоли приложения  (Прочитано 3760 раз)
Einior
Гость
« : Май 31, 2010, 21:00 »

После завершения работы программы в консоли приложения Qt Creator появляется следующее сообщение:
"QWaitCondition: Destroyed while threads are still waiting"
При этом программа не использует многопоточность.

Вот код:
Код:
#include <QApplication>
#include "humanclient.h"

int main(int argc, char **argv)
{   QApplication app(argc, argv);
    HumanClient client("localhost", 1516);

    client.show();
    return app.exec();
}----------------------------------
#ifndef HUMANCLIENT_H
#define HUMANCLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include "seamap.h"

class QTextEdit;
class QLineEdit;
class QPushButton;
class QLabel;

class HumanClient : public QWidget
{
Q_OBJECT
private:
    QTcpSocket *tcpSocket;
    QTextEdit *textInfo;
    QLineEdit *textInput;
    QPushButton *sendButton;
    QPushButton *sendMapButton;
    QPushButton *eraseMapButton;
    QLabel *myLabel;
    QLabel *enemyLabel;
    quint16 nextBlockSize;
    SeaMap *firstMap;
    SeaMap *secondMap;

public:
    HumanClient(const QString& host, int port, QWidget *parent = 0);
    ~HumanClient();

signals:

public slots:
    void slotReadyRead();
    void slotError(QAbstractSocket::SocketError);
    void slotSendToServer();
    void slotSendMap();
    void slotEraseMap();
};
------------------------------------
#include "humanclient.h"
#include <QString>
#include <QLabel>
#include <QTextEdit>
#include <QLineEdit>
#include <QRegExp>
#include <QRegExpValidator>
#include <QAbstractSocket>
#include <QLayout>
#include <QByteArray>
#include <QDataStream>
#include <QPushButton>
#include <QTextCodec>

HumanClient::HumanClient(const QString& host,
int port,
QWidget *parent) :
    QWidget(parent), nextBlockSize(0)

{
    QTextCodec *codePage = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(codePage);
    QTextCodec::setCodecForCStrings(codePage);
    QTextCodec::setCodecForLocale(codePage);

    tcpSocket = new QTcpSocket(this);
    textInfo = new QTextEdit(this);
    textInput = new QLineEdit(this);
    firstMap = new SeaMap(this);
    secondMap = new SeaMap(this);
    sendButton = new QPushButton("Огонь!", this);
    sendMapButton = new QPushButton("Отправить карту", this);
    eraseMapButton = new QPushButton("Очистить карту", this);
    myLabel = new QLabel("Моя карта", this);
    enemyLabel = new QLabel("Карта противника", this);

    sendButton->setEnabled(false);

    tcpSocket->connectToHost(host, port);
    textInfo->setReadOnly(true);

    QRegExp regExp("[A-J]([1-9]|[1][0])");
    textInput->setValidator(new QRegExpValidator(regExp, this));

    firstMap->setEnemy(false);
    secondMap->setEnemy(true);

    connect(tcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
    this, SLOT(slotError(QAbstractSocket::SocketError)));

    connect(sendButton, SIGNAL(clicked()), SLOT(slotSendToServer()));
    connect(sendMapButton, SIGNAL(clicked()),
    this, SLOT(slotSendMap()));
    connect(eraseMapButton, SIGNAL(clicked()),
    this, SLOT(slotEraseMap()));

    connect(secondMap, SIGNAL(seaCoord(const QString&)),
    textInput, SLOT(setText(const QString&)));

    QVBoxLayout *vBoxLayout = new QVBoxLayout;
    vBoxLayout->addWidget(new QLabel("<H1>Клиент</H1>"));
    vBoxLayout->addWidget(textInfo);
    vBoxLayout->addWidget(textInput);
    vBoxLayout->addWidget(sendButton);
    vBoxLayout->addWidget(sendMapButton);

    QVBoxLayout *firstFieldLayout = new QVBoxLayout;
    firstFieldLayout->addWidget(firstMap);
    firstFieldLayout->addWidget(myLabel);
    firstFieldLayout->addWidget(eraseMapButton);
    firstFieldLayout->addStretch(1);

    QVBoxLayout *secondFieldLayout = new QVBoxLayout;
    secondFieldLayout->addWidget(secondMap);
    secondFieldLayout->addWidget(enemyLabel);
    secondFieldLayout->addStretch(1);

    QHBoxLayout *mainLayout = new QHBoxLayout(this);
    mainLayout->addLayout(vBoxLayout);
    mainLayout->addLayout(firstFieldLayout);
    mainLayout->addLayout(secondFieldLayout);

    setLayout(mainLayout);
}

HumanClient::~HumanClient()
{   tcpSocket->disconnectFromHost();
}


void HumanClient::slotReadyRead()
{   QDataStream input(tcpSocket);
    QString str;
    quint16 type = 0;

    input.setVersion(QDataStream::Qt_4_6);
    for (;;)
    { if (!nextBlockSize)
{   if (tcpSocket->bytesAvailable() < sizeof(quint16))
break;
    input >> nextBlockSize;
}

if (tcpSocket->bytesAvailable() < nextBlockSize)
    break;

if (!type)
{   if (tcpSocket->bytesAvailable() < sizeof(quint16))
break;
    input >> type;
}

if (type == 3)
{   input >> str;
    textInfo->append(str);
}
nextBlockSize = 0;
    }
}

void HumanClient::slotError(QAbstractSocket::SocketError error)
{   QString strError;

    strError = "Ошибка: " + (error == QAbstractSocket::HostNotFoundError ?
    "Хост не найден." :
    error == QAbstractSocket::RemoteHostClosedError ?
    "Удалённый хост закрыт." :
    error == QAbstractSocket::ConnectionRefusedError ?
    "Отказано в соединении." :
    QString(tcpSocket->errorString()));
    textInfo->append(strError);
}

void HumanClient::slotSendToServer()
{   QByteArray block;
    QDataStream output(&block, QIODevice::WriteOnly);

    output.setVersion(QDataStream::Qt_4_6);
    output << quint16(0) << quint16(1) << textInput->text();
    output.device()->seek(0);
    output << quint16(block.size() - sizeof(quint16));

    tcpSocket->write(block);
    textInput->setText("");
}

void HumanClient::slotSendMap()
{   QByteArray block;
    QDataStream output(&block, QIODevice::WriteOnly);
    quint8 i, j;

    output.setVersion(QDataStream::Qt_4_6);
    output << quint16(0) << quint16(2);

    for (i = 1; i < 11; i++)
for (j = 1; j < 11; j++)
{   output << quint16(firstMap->getCell(i, j));
}

    output.device()->seek(0);
    output << quint16(block.size() - sizeof(quint16));
    tcpSocket->write(block);
}

void HumanClient::slotEraseMap()
{   firstMap->eraseMap();
    update();
}
-------------------------------------
Класс SeaMap не привожу, т.к. он почти аналогично используется в другой программе, не вызывающей данное предупреждение.

Благодарю за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.