[Qt-interest] Local event loop

KIMURA, Hidetaka kimura at jig.jp
Thu Dec 16 02:52:14 CET 2010


Thanks all. Running a downloading task in a separate thread solved the
problem. I have used QtConcurrentRun to run the task in a separate
thread. The implementation is like following:

qint64 timeout = QDateTime::currentMSecsSinceEpoch() + 5000;
QFuture<QByteArray> future = QtConcurrent::run(download, url);
while (!future.isFinished()) {
	if (QDateTime::currentMSecsSinceEpoch() > timeout) {
		return; // timeout
	}
	// do sleep in some way for few msecs.
}
// future.result() is the downloaded content.

download function is similar to the code of Qt Quarterly's.
http://doc.trolltech.com/qq/qq27-responsive-guis.html#waitinginalocaleventloop


On Fri, 10 Dec 2010 00:01:05 -0800 (PST)
Mihail Naydenov <mlists at ymail.com> wrote:

> Still, if you use an reiml of QThread, you can aways block the main thread 
> waiting for the thread to finish.
> Also all events will be sent to the thread event loop not the main one.
> 
> MihailNaydenov
> 
> 
> 
> ----- Original Message ----
> > From: "KIMURA, Hidetaka" <kimura at jig.jp>
> > To: qt-interest <qt-interest at trolltech.com>
> > Sent: Fri, December 10, 2010 2:25:48 AM
> > Subject: Re: [Qt-interest] Local event loop
> > 
> > Thanks guys. But I do not want to run both main and local event loop. I
> > want  to block main event loop. I want to download a file without running
> > any event  in main event loop. But as shown in my sample code, timer
> > events have fired  in eventLoop.exec().
> > 
> > On Thu, 9 Dec 2010 09:39:17 -0400
> > Brian McKinnon  <bpmckinnon.qt at gmail.com>  wrote:
> > 
> > > If I understand your problem correctly then I think you may  want to look at
> > > a QThread.  Each QThread provides its own event  loop without blocking the
> > > main event loop.
> > > 
> > > On Thu, Dec  9, 2010 at 4:46 AM, Kai Koehne <kai.koehne at nokia.com> wrote:
> > > 
> > > > On 12/9/2010 2:03 AM, ext KIMURA, Hidetaka wrote:
> > >  >  > Hi,
> > > >  >
> > > >  > Is it  possible to run a local event loop without firing events in the
> > > >  main
> > > >  > event loop? I want a MODAL event loop.
> > >  >
> > > > I doubt that the main event loop is actually delivering the  timeout
> > > > event (since it's blocked), but that the sub-event loop is  delivering it.
> > > >
> > > > You can pose some restrictions on the  types of events being delivered in
> > > > an event loop (see
> > > >  http://doc.qt.nokia.com/4.7/qeventloop.html#ProcessEventsFlag-enum ).
> > >  > Anyhow, it seems that this won't help you for your specific  problem.
> > > >
> > > > Regards
> > > >
> > > > Kai  Koehne
> > > >
> > > >  > Here is a sample code that download  a HTML in local event loop. I 
> >expect
> > > >  > that no timeout  fires in the local event loop's exec(). This code is
> > > >  >  similar to Qt Quarterly's sample.
> > > >  >
> > > >   >
> > > >
> > > >  
> >http://doc.trolltech.com/qq/qq27-responsive-guis.html#waitinginalocaleventloop
> > >  >  >
> > > >  >  #include<QCoreApplication>
> > > >  >  #include<QNetworkAccessManager>
> > > >  >  #include<QNetworkReply>
> > > >  >  #include<QNetworkRequest>
> > > >  >  #include<QTimer>
> > > >  >  #include<QUndoCommand>
> > > >  >
> > > >  > int  main(int argc, char** argv) {
> > > >  >       QCoreApplication app(argc, argv);
> > > >  >       {
> > > >  >              // The  timer will not fire in a local event loop.
> > > >  >               QUndoStack stack;
> > > >   >              for (int i = 0; i<   100; ++i) {
> > > >  >                       stack.push(new  
> >QUndoCommand(QString("%1").arg(i)));
> > > >  >                       QTimer::singleShot(i *  10,&stack, SLOT(undo()));
> > > >  >               }
> > > >  >
> > > >  >               QNetworkRequest  request(QUrl("http://example.com/"));
> > > >  >               QNetworkReply* reply;
> > > >   >              QNetworkAccessManager  manager;
> > > >  >
> > > >  >               printf("stack index = %d (should be 100)\n",
> > >  > stack.index());
> > > >  >               {
> > > >  >                       // Entering local event loop
> > >  >  >                       QEventLoop eventLoop;
> > > >  >
> > > >   >                       eventLoop.connect(&manager,
> > > >  SIGNAL(finished(QNetworkReply*)),
> > > > SLOT(quit()));
> > > >   >                       reply = manager.get(request);
> > > >  >                       eventLoop.exec();
> > >  >  >              }
> > >  >  >              printf("stack  index = %d (should be 100)\n",
> > > > stack.index());
> > > >   >      }
> > > >  >      return  0;
> > > >  > }
> > > >  >
> > > >   >
> > > >  > -------
> > > >  > KIMURA, Hide - kimura at jig.jp
> > > >
> > > >
> > >  > --
> > > > Kai Koehne
> > > > Software Engineer
> > > >  Nokia, Qt Development Frameworks
> > > >
> > > > Nokia gate5  GmbH
> > > > Firmensitz: Invalidenstr. 117, 10115 Berlin, Germany
> > >  > Registergericht: Amtsgericht Charlottenburg, Berlin: HRB 106443 B
> > >  > Umsatzsteueridentifikationsnummer: DE 812 845 193
> > > >  Gesch?ftsf?hrer: Dr. Michael Halbherr, Karim T?htivuori
> > > >  _______________________________________________
> > > > Qt-interest mailing  list
> > > > Qt-interest at trolltech.com
> > >  > http://lists.trolltech.com/mailman/listinfo/qt-interest
> > >  >
> > 
> > -------
> > KIMURA, Hide - kimura at jig.jp
> > 
> > 
> 
> 
>       

-------
KIMURA, Hide - kimura at jig.jp




More information about the Qt-interest-old mailing list