Russian Qt Forum

Qt => Работа с сетью => Тема начата: anDROid от Ноябрь 21, 2010, 17:20



Название: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 21, 2010, 17:20
В QT creator создал программку,скомпилировал релиз,скинул вместе с дллками другу,
У меня на компьютере работает на ура,а у него глючит.Пробовали через ТимВьивер,делал все как у себя,все равно.Антивирусы,файерволы вырубал.Программа с сетью работает,пост/гет запросы выполняет.Не все запросы почему-то на другом компе выполняются ??? Не знаю что и думать
П.С. У него хрюшка сп3,у мя семерка.Попробовал на другом компе с семеркой,тоже самое,не пашет. >:(


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: tim474 от Ноябрь 21, 2010, 17:30
Цитировать
В QT creator создал программку

Создавай хоть в ворде (естественно, сохранив в виде обычного текста), результат будет тот же, вопрос только в удобстве разработки.

А по теме: телепаты в отпуске, поэтому лучше выложить код программы.


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 21, 2010, 17:38
Код:
Download *d1=new Download;
d1->post("http://domain.ru/auth","Password="+password+"&Login="+mail);//Выполняется
d1->load("http://domain.ru/welcome?p=finish");//Выполняется
QString ref=d1->load("http://domain.ru/"+login+"/i/420053");
QRegExp rx2("'([0-9]{10})'");
rx2.indexIn(ref);
QString setup=d1->post("http://domain.ru/do","a=1&b=2&c="+rx2.cap(1));//Не выполняется на другом компьютере
delete d1;
Вся программа:загружаются пара страничек,выдираются с них параметры,отправляются пост запросы.Может с регекспами траблы?


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: merke от Ноябрь 21, 2010, 18:14
rx2.cap(1)

интересно... раставь плюсы как делал выше


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 21, 2010, 18:20
Ну это я так для примера)
Исправил.


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: merke от Ноябрь 21, 2010, 18:23
тут уж не дело в Qt, однозначно


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 21, 2010, 18:30
А в чем?
У меня нормально работает программа,а на других компьютерах,проверил на нескольких,глючит.
Сейчас хотим попробовать на другом компе поставить дистрибутив.


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: merke от Ноябрь 21, 2010, 18:34
зачем нам пример, ты свой проект полностью выложи, мы и скажем в чем проблема!


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 21, 2010, 18:41
http://narod.ru/disk/112631001/legenda.rar.html
Вот ссылка на проект.


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: deaks от Ноябрь 21, 2010, 22:00
маленький совет -
выкладывай исходники сразу в текст сообщения. потому что мало кто будет качать какие-то файлы с файлообменников. соответственно и вероятность, того, что тебе ответят, будет еще меньше


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 22, 2010, 13:24
После долгих экспериментов,понял вот какую вещь...У меня на компьютере лучше пинг до сервера и больше скорость.И у меня вся страница нормально грузится в буфер,а у друга пинг в 2 раза больше моего,и у него в буфере после загрузки остается только конец страницы...На виртуальной машине попробовал запустить,тоже только обрывок с конца страницы в буфере оказывался,сделал цикл,пока не загрузится до конца,грузить еще раз,стало нормально работать.А у друга цикл входит в бесконечность,никак не может загрузить.
Какие могут быть причины что в буфере остается только конец страницы?Может таймаут загрузки надо увеличить?Если да,то как?

main.cpp
Код:
void Download::getReplyFinished()
{
    reply->deleteLater();
}

void Download::readyReadReply()
{
    buffer = QString::fromUtf8(reply->readAll());
}

QString Download::load(QString url)
{
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    reply=manager.get(request);
    connect(reply, SIGNAL(finished()), this, SLOT(getReplyFinished()));
    connect(reply,SIGNAL(readyRead()),this, SLOT(readyReadReply()));
    QEventLoop loop(this);
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    return buffer;
}

download.h
Код:
#ifndef DOWNLOAD_H
#define DOWNLOAD_H
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>

class Download : public QObject
{
    Q_OBJECT

public:
    QString load(QString url);
private:
    QString buffer;
    QNetworkAccessManager manager;
    QNetworkReply *reply;
    QString Url;
public slots:
    void getReplyFinished();
    void readyReadReply();
};
#endif // DOWNLOAD_H


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: Denjs от Ноябрь 22, 2010, 13:37
а вы уверены, что d1->post() - это синхронная функция которая задерживает управление ДО момента окончания операции?
я вот так лично не уверен (простите, код не анализировал пока...)

а то что получается-то?
Код:
QString setup=d1->post("http://domain.ru/do","a=1&b=2&c="+rx2.cap(1));//Не выполняется на другом компьютере
delete d1;
- получается так, что вы даете объекту команду начать отправку, и сразу-же удаляете нафиг объект? а он в это время в самом разгаре задушевной беседы с сервером о смысле жизни и о ваших страниках которые вы пытаетесь получить от сервера... зачем вы так?!)))

а во вторых, почему вы так - "delete d1;" ?!
 эзвините - но юзать delete для QObject объектов (он же у вас надеюсь от QObject наследован) - это вам ещё и сегфолтом черевато.
делайте d1.deleteLater() - и (возможно) будет вас счастье. Этим вы скажете Qt что объект вам больше не нужен и она сама "грохнет" его (аккуратно и тихо) когда это будет возможно.


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 22, 2010, 13:45
Сделал по-вашему,сейчас пробуем...
Вот функция пост.

Код:
QString Download::post(QString url,QString post)
{
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    request.setRawHeader(QByteArray("User-Agent"), QByteArray("User-Agent=Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.12) Gecko/20101026 MRA 5.6 (build 03402) Firefox/3.6.12 GTB7.1"));
    reply=manager.post(request,post.toUtf8());
    connect(reply, SIGNAL(finished()), this, SLOT(getReplyFinished()));
    connect(reply,SIGNAL(readyRead()),this, SLOT(readyReadReply()));
    QEventLoop loop(this);
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    return buffer;
}
Я так понял, что луп должен задерживать выполнение, пока страница не прогрузится до конца?

d1.deleteLater() изменил,но все равно также.В буфере только часть страницы.


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: crossly от Ноябрь 22, 2010, 14:27
не стоит мешать синхронную работу с асинхронной...
убрать
Код:
connect(reply, SIGNAL(finished()), this, SLOT(getReplyFinished()));
connect(reply,SIGNAL(readyRead()),this, SLOT(readyReadReply()));

и после loop.exec() прочитать все целиком с помощью readAll()


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: anDROid от Ноябрь 22, 2010, 14:38
Код:
QString Download::post(QString url,QString post)
{
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    request.setRawHeader(QByteArray("User-Agent"), QByteArray("User-Agent=Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.12) Gecko/20101026 MRA 5.6 (build 03402) Firefox/3.6.12 GTB7.1"));
    reply=manager.post(request,post.toUtf8());
    //connect(reply, SIGNAL(finished()), this, SLOT(getReplyFinished()));
    //connect(reply,SIGNAL(readyRead()),this, SLOT(readyReadReply()));
    QEventLoop loop(this);
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    buffer = QString::fromUtf8(reply->readAll());
    return buffer;
}
Вот так?

Походу так)РАБОТАЕТ!!!СПАСИБО вам огромное!!


Название: Re: Программа на разных компьютерах работает по-разному
Отправлено: crossly от Ноябрь 22, 2010, 14:55
именно так... и разберитесь как все же работает Qt.... дабы в будущем избежать подобных проблем...