[Qt-interest] QThread and QNetwork
BRM
bm_witness at yahoo.com
Thu May 26 19:14:35 CEST 2011
----- Original Message ----
> From: Matias Hernandez Arellano <msdark at archlinux.cl>
> To: qt-interest at qt.nokia.com
> (sorry for my english)
>
> Hi, i'm trying do make an application to query a couchdb database using HTTP
>request to the _change API of the database.
>
> To do this i create a class (DBCheck) that make a request to the _change API
>using the continuos feed, this is a HTTP connection that live forever and make
>possible to notify the client when a change occur in DB (real time, like Push
>notification).
>
> Then i create another class (just for test) no show a notification (in
>console) of the change.
>
> I connect this two classes using Signals and Slots.
>
> Now i need to make this work with a GUI, the idea is show in a part of the GUI
>a "table" that auto--update any change in DB (when DB notify for changes)..
>
> To do this i thought i need to use Threads, so for testing purpose i create a
>console application and try to run this, but i can't make that the Http class
>(DBCheck) run inside a thread an notify every change to the main thread (or
>other object using signals) .. i get an error about the diferents parents of
>the object..
>
> So this is the code (without thread)
> #ifndef DBCHECK_H
> #define DBCHECK_H
> #include <QNetworkAccessManager>
> #include <QUrl>
> #include <QObject>
> #include <QByteArray>
> #include <qjson/parser.h>
> #include <QVariantMap>
> #include <QDebug>
> class QNetworkReply;
> class DBCheck: public QObject
> {
> Q_OBJECT
> public:
> DBCheck();
> void startRequest(QUrl);
> signals:
> void change();
> private slots:
> void httpFinished();
> void httpReadyRead();
> private:
> QUrl url;
> QNetworkAccessManager qnam;
> QNetworkReply *reply;
> };
>
> DBCheck::DBCheck()
> {
> }
> void DBCheck::startRequest(QUrl url){
> reply = qnam.get(QNetworkRequest(url));
> connect(reply, SIGNAL(finished()),this, SLOT(httpFinished()));
> connect(reply, SIGNAL(readyRead()),this, SLOT(httpReadyRead()));
> return;
> }
> void DBCheck::httpFinished(){
> qDebug()<<"Finished";
> return;
> }
> void DBCheck::httpReadyRead(){
> this->result = this->reply->readAll();
> emit change();
> }
>
>
> //the other class
> #ifndef NOTIF_H
> #define NOTIF_H
> #include <QObject>
> #include <QDebug>
> class Notif:public QObject{
> Q_OBJECT
> public:
> Notif(){
> }
> ~Notif(){
> }
> public slots:
> void notificar(){
> qDebug()<<"Cambio!";
> }
> };
> #endif // NOTIF_H
>
> and the main.cpp
> #include <QCoreApplication>
> #include "dbcheck.h"
> #include "notif.h"
> #include <QDebug>
> int main(int argc, char *argv[]){
> QCoreApplication app(argc, argv);
> DBCheck *db = new DBCheck();
> Notif *t = new Notif();
> QObject::connect(db,SIGNAL(change()),t,SLOT(notificar()));
>
>db->startRequest(QUrl("http://127.0.0.1:5984/test/_changes?feed=continuous&since=39"));
>
> return app.exec();
> }
>
> How can i run the DBCheck object in a thread???
>
> any guideline or idea would very appreciate ...
>
Setup the signals/slots to provide the communication of data you need - e.g.
data from the DB and data to the DB - then just do the following in main:
QThread dbCheckThread;
db->moveToThread(&dbCheckThread)
dbCheckThread.start();
Ben
P.S. You do not need the DBCheck* db = new DBCheck() in your example, you could
just put it on the stack (e.g. DBCheck db - just remember to do &db where you
need the pointer (e.g. connect()).
More information about the Qt-interest-old
mailing list