Re: [Interest] QFutureWatcher not emitting signals

2016-11-23 Thread Bob Hood
Nevermind.  It's a problem at the macro level.  This will only work when the 
Tasklet class is created from the main thread.  I was creating it from deep 
down inside calls originating from a QThread object, which is apparently a no-no.


I'll refactor to notify the main thread to create these instances, and all 
should be well.


Sorry to bother.


On 11/23/2016 8:16 PM, Bob Hood wrote:
I did some Googling about this, and found a LOT of hits about QFutureWatcher 
not emitting its signals (like finished()) when the QFuture it's watching 
completes.  However, in all cases I've seen, people were using an auto 
version of QFutureWatcher which dropped out of scope on them (i.e., 
allocated on the local stack). Allocating it on the heap seemed to solve all 
problems I found.


Well, it isn't solving it for me.  I'm using Qt 5.6.2.  I have a simple 
tasklet class that performs a discrete function in a separate thread 
independent of the main process.  Its basic structure looks like this:


Definition:

class Tasklet : public QObject
{
Q_OBJECT
public:
Tasklet(...args...);
~Tasklet();

signals:
voidsignal_result(const QString& reference, bool result);

private slots:
voidslot_future_finished();

private:// methods
boolrun();

private:// data members
...args...

QFutureWatcher*   watcher;
};

Implementation:

Tasklet::Tasklet(...args...) : ...init...
{
QFuture future = QtConcurrent::run(this, ::run);
watcher = new QFutureWatcher();
connect(watcher, ::finished, this, 
::slot_future_finished);

watcher->setFuture(future);
}

bool Tasklet::run()
{
...processing...
return true;
}

void Tasklet::slot_future_finished()
{
emit signal_result(reference, watcher->result());
watcher->deleteLater();
}

Tasklet::slot_future_finished() is NEVER called. I've verified that the 
connect() returns true, tried using the old-style syntax for connect, and 
I've also tried having a class member for QFutureWatcher instead of 
allocating it on the heap. No joy.


Can another pair of eyes see what am I doing wrong here?
___
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest



___
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest


[Interest] QFutureWatcher not emitting signals

2016-11-23 Thread Bob Hood
I did some Googling about this, and found a LOT of hits about QFutureWatcher 
not emitting its signals (like finished()) when the QFuture it's watching 
completes.  However, in all cases I've seen, people were using an auto version 
of QFutureWatcher which dropped out of scope on them (i.e., allocated on the 
local stack). Allocating it on the heap seemed to solve all problems I found.


Well, it isn't solving it for me.  I'm using Qt 5.6.2.  I have a simple 
tasklet class that performs a discrete function in a separate thread 
independent of the main process.  Its basic structure looks like this:


Definition:

class Tasklet : public QObject
{
Q_OBJECT
public:
Tasklet(...args...);
~Tasklet();

signals:
voidsignal_result(const QString& reference, bool result);

private slots:
voidslot_future_finished();

private:// methods
boolrun();

private:// data members
...args...

QFutureWatcher*   watcher;
};

Implementation:

Tasklet::Tasklet(...args...) : ...init...
{
QFuture future = QtConcurrent::run(this, ::run);
watcher = new QFutureWatcher();
connect(watcher, ::finished, this, 
::slot_future_finished);

watcher->setFuture(future);
}

bool Tasklet::run()
{
...processing...
return true;
}

void Tasklet::slot_future_finished()
{
emit signal_result(reference, watcher->result());
watcher->deleteLater();
}

Tasklet::slot_future_finished() is NEVER called. I've verified that the 
connect() returns true, tried using the old-style syntax for connect, and I've 
also tried having a class member for QFutureWatcher instead of allocating it 
on the heap. No joy.


Can another pair of eyes see what am I doing wrong here?
___
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest