Grazie per l'aiuto. Non ho ancora provato con QFuture perche' ho visto che c'e' scritto nel Help:
"... Be aware that not all asynchronous computations can be canceled. For example, the future returned by QtConcurrent::run() cannot be canceled; but the future returned by QtConcurrent::mappedReduced() can...".
Sembra che le elaborazioni lanciate con QtConcurrent non si puo' usare il metodo "QFuture::cancel()".
Il codice e' il seguente:
Con questo metodo lancio i vari "QtConcurrent::run":
@void DBManagerObj::NewOptSlot(const NewOptDataDB &tNewOptData)
{
if(DBManagerThrStatus::RUN_STS == _tThrStatus.iStatus)
{
DBIntStatusFut *ptFut = new DBIntStatusFut(QtConcurrent::run(this,
&DBManagerObj::NewOptExecThr,
tNewOptData));
poco_check_ptr(ptFut);
_rgptResFuture.append(ptFut);
}
}
@
Questo e' il metodo che esegue le operazioni di scrittura su Database (da notare che non uso le funzionalita' dell Qt SQL, ma utilizzo in questo caso le POCO C++ library, perche' hanno la gestione integrata del "Session Pool" e poi perche' hanno altre Feature che ho gia' utilizzate in passato)
@DBManagerObj::DBIntStatus DBManagerObj::NewOptExecThr(const NewOptDataDB &tNewOptData)
{
if(!_ptSessPool)
{
poco_warning(_tLog,
"DBManagerObj: WARNING: no Session Pool!");
return DBManagerObj::DBIntStatus(-1);
}
QElapsedTimer tTimer;
tTimer.start();
try
{
Poco::Data::Session tSess(_ptSessPool->get());
tSess << "INSERT INTO TNewOptData (BTCTL, ID, BTC1m, Vel, DLTLDist, DLPos) "
"VALUES(?,?,?,?,?,?)",
Poco::Data::use(tNewOptData.i32BTCTL),
Poco::Data::use(tNewOptData.i32ID),
Poco::Data::use(tNewOptData.BTC1m),
Poco::Data::use(tNewOptData.Vel),
Poco::Data::use(tNewOptData.DLTLDist),
Poco::Data::use(tNewOptData.DLPos),
Poco::Data::now;
}
catch(Poco::Data::ODBC::ODBCException &tExc)
{
std::string strTemp = "DBManagerObj: Insert Data Failed!: ";
strTemp += tExc.className();
strTemp += " ";
strTemp += tExc.displayText();
poco_warning(_tLog,
strTemp);
}
return DBManagerObj::DBIntStatus(1,
tTimer.elapsed());
}
@
Il problema secondo me e' che se nel secondo metodo, per qualche motivo l'elaborazione si dovesse prolungare, non ho modo di concludere l'operazione se l'utente chiede di arrestare il programma. Mettendo infatti una Sleep (tanto per simulare un "Long Run"), all'interno del secondo metodo, il programma resta piantato fintatnto che il QtConcurrent::run non finisce l'esecuzione.
Saluti
Giulio