I see, I'll give it a go and get back with the result.

Thanks for your help Andrey 
Kris

On Wed May 28 2014 19:38:35 GMT+0100 (BST), Andrey Kozhevnikov wrote:
> you can't do it. you should call it with slot only, else it will be 
> called in current thread, not one you created.
> 
> 28.05.2014 23:07, Krisztian Olah ?????:
> > it just calls:
> >
> > //pointer also a member
> > parser->addData()
> > parser->parse()
> >
> > although it is a bit messy, here is my parser class and its methods:
> >
> > //header:
> > #include  <QObject>
> > #include  <QXmlStreamReader>
> > #include  <QSharedPointer>
> > #include  "disruption.h"
> > #include  "street.h"
> > #include  "trafficcontainer.h"
> > class  TrafficXmlReader  :  public  QObject
> > {
> >      Q_OBJECT
> > public:
> >      TrafficXmlReader(QObject*  parent  =  0);
> > private:
> >      //TrafficContainer has a QList<Disruption> and a QHash<int,Street> 
> > member
> >      // and it interacts with 2 corresponding models for each contained 
> > container
> >      QSharedPointer<TrafficContainer>  container;
> >      int  count;
> >      int  currentID;
> >      Disruption  currentDisruption;//just a struct containing the strings
> >      Street  currentStreet;//just a struct containing the strings
> >      bool  inDisruption;
> >      bool  inPoint;
> >      bool  inStreet;
> >      QXmlStreamReader  reader;
> > public:
> >      void  setContainer(QSharedPointer<TrafficContainer>);
> >      void  setDevice(QIODevice*);
> > signals:
> >      void  finished();
> >      void  partFinished();
> > public  slots:
> >      void  addData(const  QByteArray&);
> >      void  parse();
> > };
> > #endif  //  TRAFFICXMLREADER_H
> > //implementation:
> > #include  "trafficxmlreader.h"
> > #include  <QDebug>
> > #include  <QRegExp>
> >
> > #include  "trafficcontainer.h"
> >
> >
> > TrafficXmlReader::TrafficXmlReader(QObject*  c)  :  
> > container(static_cast<TrafficContainer*>(c)),
> >
> >                                                            count(0),
> >
> >                                                            currentID(0),
> >
> >                                                            
> > inDisruption(false),
> >
> >                                                            inPoint(false),
> >
> >                                                            inStreet(false)
> >
> > {
> >      reader.setNamespaceProcessing(false);
> >
> > }
> > void  TrafficXmlReader::setContainer(QSharedPointer<TrafficContainer>  
> > newContainer)  {
> >
> >      container.clear();
> >
> >      container  =  newContainer;
> >
> > }
> >
> > void  TrafficXmlReader::setDevice(QIODevice*  device)  {  
> > reader.setDevice(device);  }
> >
> >
> > //public  slots:
> > void  TrafficXmlReader::addData(const  QByteArray&  data)  {  
> > reader.addData(data);  }
> >
> >
> > void  TrafficXmlReader::parse()  {
> >
> >      while  (!reader.atEnd())  {
> >
> >          reader.readNext();
> >
> >          ++count;
> >
> >          if  (reader.qualifiedName()  ==  "Disruption")  {
> >
> >              if  (reader.isStartElement())  {
> >
> >                  inDisruption  =  true;
> >
> >                  currentID  =  reader.attributes().value("id").toInt();
> >
> >              }
> >              else  if  (reader.isEndElement())  {
> >
> >                  currentDisruption.id  =  currentID;
> >
> >                  currentID  =  0;
> >
> >                  container.data()->addDisruption(currentDisruption);
> >
> >                  inDisruption  =  false;
> >
> >              }
> >          }
> >
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  "status") 
> >  {
> >
> >              currentDisruption.status  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "severity")  {
> >
> >              currentDisruption.severity  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "levelOfInterest")  {
> >
> >              currentDisruption.levelOfInterest  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "category")  {
> >
> >              currentDisruption.category  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "subCategory")  {
> >
> >              currentDisruption.subCategory  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "startTime")  {
> >
> >              currentDisruption.startTime  =  reader.readElementText();
> >
> >          }
> >          //replace  ','  with  ",  "  if  not  followed  by  a  whitespace, 
> >  happends  many  times  due  to  lousy  typing
> >
> >          //it  is  to  make  WordWrap  possible  in  gui
> >
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "location")  {
> >
> >              QString  location  =  reader.readElementText();
> >
> >              int  i;
> >
> >              while  ((i  =  location.indexOf(QRegExp(",[^\\s-]")))  !=  -1  
> > )  {
> >
> >                  location  =  location.insert(++i,  "  ");
> >
> >              }
> >              currentDisruption.location  =  location;
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "comments")  {
> >
> >              currentDisruption.comments  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "currentUpdate")  {
> >
> >              currentDisruption.currentUpdate  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "remarkTime")  {
> >
> >              currentDisruption.remarkTime  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  
> > "lastModTime")  {
> >
> >              currentDisruption.lastModTime  =  reader.readElementText();
> >
> >          }
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  "Point")  
> > {
> >
> >              inPoint  =  true;
> >
> >          }
> >          else  if  (inDisruption  &&  inPoint  &&  reader.qualifiedName()  
> > ==  "coordinatesLL")  {
> >
> >              currentDisruption.coordinates  =  reader.readElementText();
> >
> >          }
> >
> >          //Streets
> >          else  if  (inDisruption  &&  reader.qualifiedName()  ==  "Street") 
> >  {
> >
> >              if  (reader.isStartElement())  {
> >
> >                  inStreet  =  true;
> >
> >              }
> >              else  if  (reader.isEndElement())  {
> >
> >                  container.data()->addStreet(currentID,  currentStreet);
> >
> >              }
> >          }
> >
> >          else  if  (inDisruption  &&  inStreet  &&  reader.qualifiedName()  
> > ==  "name")  {
> >
> >              QString  name  =  reader.readElementText();
> >
> >              int  i;
> >
> >              while  ((i  =  name.indexOf(QRegExp(",[^\\s-]")))  !=  -1  )  {
> >
> >                  name  =  name.insert(++i,  "  ");
> >
> >              }
> >              currentStreet.name  =  name;
> >
> >          }
> >          else  if  (inDisruption  &&  inStreet  &&  reader.qualifiedName()  
> > ==  "closure")  {
> >
> >              QString  closure  =  reader.readElementText();
> >
> >                  currentStreet.closure  =  (closure  ==  "Open")  ?  
> > "Affected"  :  closure;
> >
> >          }
> >          else  if  (inDisruption  &&  inStreet  &&  reader.qualifiedName()  
> > ==  "directions")  {
> >
> >              currentStreet.directions  =  
> > reader.readElementText().toLower();
> >
> >          }
> >
> >          if  (reader.hasError())  {
> >
> >              if  (reader.error()  ==  
> > QXmlStreamReader::PrematureEndOfDocumentError)  {
> >
> >                  qDebug()  <<  "partFinished";
> >
> >                  emit  partFinished();
> >
> >              }
> >              else  {  qDebug()  <<  "An  Error  has  occured  while  
> > parsing.";  }
> >
> >
> >          }
> >
> >      }
> >
> >      if  (!reader.hasError())  {
> >
> >          qDebug()  <<  "parser.atEnd()";
> >
> >          qDebug()  <<  "Found  "  <<  count  <<  "  tags";
> >
> >          emit  finished();
> >
> >      }
> > }
> >
> >
> >
> >
> >
> >
> > On 28 May 2014 16:07, Andrey Kozhevnikov <coderusin...@gmail.com 
> > <mailto:coderusin...@gmail.com>> wrote:
> >
> >     need to look into your parseReadyData
> >
> >     28.05.2014 22:03, Krisztian Olah ?????:
> >>     Hi Andrey,
> >>        Thanks for the answer, your snippet looks very similar to what
> >>     I have. Perhaps if I posted my code segment would be of help in
> >>     helping me figuring out where I'm wrong.
> >>        During parsing CPU usage reaches 97-100% which causes my GUI
> >>     to hang(I have about 500 000 opening and closing tags and half of
> >>     the enclosed items I need to process: save, in some cases insert
> >>     spaces, etc), especially awkward when I start parsing whilst
> >>     still fetching the data from network(sometimes hangs during
> >>     pageStack.push() ), but it's bad for up to 2-5 seconds
> >>     nevertheless. I wouldn't mind if parsing took 10 seconds if GUI
> >>     was responsive. This is what I'm doing:
> >>
> >>     void SomeClass::someMethod() {
> >>                   MyContainer* container = new MyContainer();
> >>                   //reader has a handle to container, through which
> >>     it populates the container
> >>                   MyXmlStreamReader* parser = new
> >>     MyXmlStreamReader(container);
> >>                   QThread* parserThread = new QThread();
> >>     parser->moveToThread(parserThread);
> >>              connect(parser, SIGNAL(finished()), this, 
> >> SLOT(onParsingFinished) );
> >>              connect(parser, SIGNAL(finished()), parserThread, 
> >> SLOT(quit()) );
> >>              connect(parser, SIGNAL(finished()), parser, 
> >> SLOT(deleteLater()) );
> >>              connect(parserThread, SIGNAL(finished()), parserThread, 
> >> SLOT(deleteLater()) );
> >>              parserThread->start();
> >>              reply = networkMngr->get(QNetworkRequest(someUrl)); //both 
> >> pointers are class members
> >>              connect(reply, SIGNAL(finished()), this, 
> >> SLOT(onAllDataRecieved()) );
> >>              //this starts the parser with the data available at the time,
> >>                    // when parser reaches the end of xml document it emits 
> >> itsfinished() signal
> >>              connect(reply, SIGNAL(readyRead()), this, 
> >> SLOT(parseReadyData()) );
> >>     }
> >>
> >>     Thanks again
> >>     Kris
> >>
> >>
> >>     On 28 May 2014 06:16, Andrey Kozhevnikov <coderusin...@gmail.com
> >>     <mailto:coderusin...@gmail.com>> wrote:
> >>
> >>         it can't "doesn't help much". you initializing thread wrong.
> >>
> >>         simple threading way is:
> >>
> >>         MyXmlParser *parser = new MyXmlParser(xmlDocument);
> >>         QThread *thread = new QThread(parser);
> >>         parser->moveToThread(thread);
> >>         QObject::connect(thread, SIGNAL(started()), parser,
> >>         SLOT(parse()));
> >>         QObject::connect(parser, SIGNAL(parseComplete(QVariantMap)),
> >>         this, SLOT(onParseComplete(QVariantMap)));
> >>         thread->start();
> >>
> >>         28.05.2014 03:24, Krisztian Olah ?????:
> >>>               Hi list,
> >>>           I have a rather large xml file to parse and it causes the
> >>>         UI to freeze, I assingned the parser to a different thread,
> >>>         but it doesn't help much. According to the Qt documentation
> >>>         QThread::setPriority() doesn't work on Linux, is there some
> >>>         kind of workaround that could be used?
> >>>
> >>>         Thanks
> >>>         Kris
> >>>
> >>>
> >>>         _______________________________________________
> >>>         SailfishOS.org Devel mailing list
> >>>         To unsubscribe, please send a mail 
> >>> todevel-unsubscr...@lists.sailfishos.org  
> >>> <mailto:devel-unsubscr...@lists.sailfishos.org>
> >>
> >>
> >>         _______________________________________________
> >>         SailfishOS.org Devel mailing list
> >>         To unsubscribe, please send a mail to
> >>         devel-unsubscr...@lists.sailfishos.org
> >>         <mailto:devel-unsubscr...@lists.sailfishos.org>
> >>
> >>
> >>
> >>
> >>     _______________________________________________
> >>     SailfishOS.org Devel mailing list
> >>     To unsubscribe, please send a mail 
> >> todevel-unsubscr...@lists.sailfishos.org  
> >> <mailto:devel-unsubscr...@lists.sailfishos.org>
> >
> >
> >     _______________________________________________
> >     SailfishOS.org Devel mailing list
> >     To unsubscribe, please send a mail to
> >     devel-unsubscr...@lists.sailfishos.org
> >     <mailto:devel-unsubscr...@lists.sailfishos.org>
> >
> >
> >
> >
> > _______________________________________________
> > SailfishOS.org Devel mailing list
> > To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org
> 
>
_______________________________________________
SailfishOS.org Devel mailing list
To unsubscribe, please send a mail to devel-unsubscr...@lists.sailfishos.org

Reply via email to