?? timers.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/object.doc:85 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Translator" content="Cavendish">
<meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt">
<title>定時器</title>
<style type="text/css"><!--
h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; font-family: "Times New Roman" }
--></style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
<a href="index.html">
<font color="#004faf">主頁</font></a>
| <a href="classes.html">
<font color="#004faf">所有的類</font></a>
| <a href="mainclasses.html">
<font color="#004faf">主要的類</font></a>
| <a href="annotated.html">
<font color="#004faf">注釋的類</font></a>
| <a href="groups.html">
<font color="#004faf">分組的類</font></a>
| <a href="functions.html">
<font color="#004faf">函數(shù)</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table>
<h1 align=center>定時器</h1>
<p> 在Qt中,<a href="qobject.html">QObject</a>,所有Qt對象的基類,提供了一個基本的定時器。通過<a href="qobject.html#startTimer">QObject::startTimer</a>(),你可以把一個以毫秒為單位的<em>時間間隔</em>作為參數(shù)來開始定時器。這個函數(shù)返回一個唯一的整數(shù)的定時器的標(biāo)識符。這個定時器現(xiàn)在就會在每一個<em>時間間隔</em>“觸發(fā)”,直到你明確地使用這個定時器的標(biāo)識符來調(diào)用<a href="qobject.html#killTimer">QObject::killTimer</a>()結(jié)束。
<p> 對于這種工作機(jī)制,應(yīng)用程序不得不在一個事件回路中運(yùn)行。你通過<a href="qapplication.html#exec">QApplication::exec</a>()來開始一個事件回路。當(dāng)定時器觸發(fā)時,應(yīng)用程序會發(fā)送一個<a href="qtimerevent.html">QTimerEvent</a>,并且控制流直到定時器事件被處理時才會離開事件回路。這暗示著當(dāng)你的應(yīng)用程序正忙于其它事情的時候,定時器不能觸發(fā)。換句話說,定時器的精確性依賴于你的應(yīng)用程序的間隔尺度。
<p> 事實(shí)上,對于間隔值是沒有上限的(超過一年也是可能的)。精確性依賴于位于下面的操作系統(tǒng)。Windows 95/98的精確度為55毫秒(每秒18.2次),其它我們已經(jīng)測試過的操作系統(tǒng)(UNIX X11、Windows NT和OS/2)都可以處理1毫秒的間隔。
<p> 定時器功能的主要的應(yīng)用程序接口是<a href="qtimer.html">QTimer</a>。這個類可以提供當(dāng)定時器觸發(fā)的時候發(fā)射一個信號的有規(guī)律的定時器,并且繼承了<a href="qobject.html">QObject</a>,所以它很適合絕大多數(shù)圖形用戶界面程序的所有權(quán)結(jié)構(gòu)。通常的使用方法如下:
<pre>
<a href="qtimer.html">QTimer</a> * counter = new <a href="qtimer.html">QTimer</a>( this );
connect( counter, SIGNAL(<a href="qtimer.html#timeout">timeout</a>()),
this, SLOT(updateCaption()) );
counter-><a href="qtimer.html#start">start</a>( 1000 );
</pre>
<p> counter定時器被作為這個窗口部件的子類,這樣當(dāng)這個窗口部件被刪除時,定時器也會被刪除。接下來,它的timeout信號被連接到將要做工作的槽上,最后它開始了。
<p> <a href="qtimer.html">QTimer</a>也提供了一個簡單的只有一次定時器的應(yīng)用程序接口。<a href="qbutton.html">QButton</a>,當(dāng)鍵盤被用來“按下”按鈕的時候,在按鈕被按下來顯示按鈕和接下來(0.1秒之后)被釋放時使用它來顯示按鈕,例如:
<p> <pre>
QTimer::<a href="qtimer.html#singleShot">singleShot</a>( 100, this, SLOT(animateTimeout()) );
</pre>
<p> 在這行代碼之后0.1秒時,同一個按鈕的animateTimeout()槽被調(diào)用。
<p> 這里是一個通過QTimer對象的信號和槽來進(jìn)行對象通訊的不太復(fù)雜的實(shí)例的大綱。它示范了一個單線程應(yīng)用程序如何使用定時器在不阻塞用戶界面的情況下進(jìn)行精確運(yùn)算的。
<p> <pre>
// Mandelbrot類使用QTimer在不阻塞CPU的情況下來計算一個掃描行。
// 它繼承了QObject來使用信號和槽。調(diào)用start()來開始運(yùn)算。當(dāng)運(yùn)
// 算完成時,done()信號被發(fā)射。注意這個例子并不完全,只是一個
// 大綱。
class Mandelbrot : public <a href="qobject.html">QObject</a>
{
<a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a> // 因?yàn)樾枰褂眯盘?槽
public:
Mandelbrot( <a href="qobject.html">QObject</a> *parent=0, const char *name );
...
public slots:
void start();
signals:
void done();
private slots:
void calculate();
private:
<a href="qtimer.html">QTimer</a> timer;
...
};
//
// 構(gòu)造并初始化Mandelbrot對象。
//
Mandelbrot::Mandelbrot( <a href="qobject.html">QObject</a> *parent=0, const char *name )
: <a href="qobject.html">QObject</a>( parent, name )
{
<a href="qobject.html#connect">connect</a>( &timer, SIGNAL(<a href="qtimer.html#timeout">timeout</a>()), SLOT(calculate()) );
...
}
//
// 開始運(yùn)算任務(wù)。內(nèi)部的calculate()槽會每10毫秒被激活一次。
//
void Mandelbrot::start()
{
if ( !timer.<a href="qtimer.html#isActive">isActive</a>() ) // 還沒有準(zhǔn)備好運(yùn)行
timer.<a href="qtimer.html#start">start</a>( 10 ); // 每10毫秒超時
}
//
// 每次運(yùn)算一個掃描行。
// 當(dāng)結(jié)束時發(fā)射done()信號。
//
void Mandelbrot::calculate()
{
... // 執(zhí)行一個掃描行的運(yùn)算
if ( finished ) { // 沒有更多的掃描行了
timer.<a href="qtimer.html#stop">stop</a>();
emit done();
}
}
</pre>
<p>
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2002
<a href="http://www.trolltech.com">Trolltech</a>
<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td><a href="zh_CN.html">譯者:Cavendish</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -