C++ (Qt)
int sduration = ...;
const int mss = 1000;
QTimeLine *tl = new QTimeLine(sduration * mss, this);
tl->setDirection(QTimeLine::Backward);
tl->setUpdateInterval(mss);
tl->setCurveShape(QTimeLine::LinearCurve);
tl->setFrameRange(0,sduration);
connect(tl, SIGNAL(frameChanged(int)), this, SLOT(on_framech(int)));
connect(tl, SIGNAL(finished()), tl, SLOT(deleteLater()));
tl->start();
в слот on_framech(int) будет приходить оставшееся время. Еще можно повесить обработчик на сигнал finished() чтобы что-то делать
UPD: можно заменить порядок аргументов в setFrameRange, тогда можно избавиться от setDirection