?? qwaitcondition.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-x11-commercial-3.0.5/src/tools/qwaitcondition_unix.cpp:82 -->
<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>QWaitCondition類</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">函數</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>QWaitCondition類參考</h1>
<p>QWaitCondition類是線程之間允許等待/喚醒的條件。
<a href="#details">詳情請見……</a>
<p><tt>#include <<a href="qwaitcondition-h.html">qwaitcondition.h</a>></tt>
<p><a href="qwaitcondition-members.html">所有成員函數的列表。</a>
<h2>公有成員</h2>
<ul>
<li><div class=fn><a href="#QWaitCondition"><b>QWaitCondition</b></a> ()</div></li>
<li><div class=fn>virtual <a href="#~QWaitCondition"><b>~QWaitCondition</b></a> ()</div></li>
<li><div class=fn>bool <a href="#wait"><b>wait</b></a> ( unsigned long time = ULONG_MAX )</div></li>
<li><div class=fn>bool <a href="#wait-2"><b>wait</b></a> ( QMutex * mutex, unsigned long time = ULONG_MAX )</div></li>
<li><div class=fn>void <a href="#wakeOne"><b>wakeOne</b></a> ()</div></li>
<li><div class=fn>void <a href="#wakeAll"><b>wakeAll</b></a> ()</div></li>
</ul>
<hr><a name="details"></a><h2>詳細描述</h2>
QWaitCondition類是線程之間允許等待/喚醒的條件。
<p>
<p> QWaitConditions允許一個線程告訴其它線程某種條件已經滿足,一個或多個線程可以等待一個由<a href="#wakeOne">wakeOne</a>()或<a href="#wakeAll">wakeAll</a>()設定的條件QWaitCondition。使用wakeOne()會喚醒一種隨機選擇的事件或者wakeAll()會把它們全部喚醒。比如,假定每次用戶按下一個鍵,我們有三個任務要同時執行,每個任務都可以放到一個線程中,每個線程的run()都應該是這樣:
<p> <pre>
QWaitCondition key_pressed;
for (;;) {
key_pressed.<a href="#wait">wait</a>(); // 這是一個QWaitCondition全局變量
// 鍵被按下,做一些有趣的事
do_something();
}
</pre>
<p> 第四個線程回去讀鍵按下并且每當它接收到一個的時候喚醒其它三個線程,就像這樣:
<p> <pre>
QWaitCondition key_pressed;
for (;;) {
getchar();
// 在key_pressed中導致引起任何一個線程。<a href="#wait">wait</a>()將會從這個方法中返回并繼續執行
key_pressed.<a href="#wakeAll">wakeAll</a>();
}
</pre>
<p> 注意這三個線程被喚醒的順序是未定義的,并且當鍵被按下時,這些線程中的一個或多個還在do_something(),它們將不會被喚醒(因為它們現在沒有等待條件變量)并且這個任務也就不會針對這次按鍵執行操作。這種情況是可以避免得,比如,就像下面這樣做:
<p> <pre>
<a href="qmutex.html">QMutex</a> mymutex;
QWaitCondition key_pressed;
int mycount=0;
// 工人線程代碼
for (;;) {
key_pressed.<a href="#wait">wait</a>(); // 這是一個QWaitCondition全局變量
mymutex.<a href="qmutex.html#lock">lock</a>();
mycount++;
mymutex.<a href="qmutex.html#unlock">unlock</a>();
do_something();
mymutex.<a href="qmutex.html#lock">lock</a>();
mycount--;
mymutex.<a href="qmutex.html#unlock">unlock</a>();
}
// 讀取按鍵線程代碼
for (;;) {
getchar();
mymutex.<a href="qmutex.html#lock">lock</a>();
// 睡眠,直到沒有忙碌的工作線程才醒來。
while( count > 0 ) {
mymutex.<a href="qmutex.html#unlock">unlock</a>();
sleep( 1 );
mymutex.<a href="qmutex.html#lock">lock</a>();
}
mymutex.<a href="qmutex.html#unlock">unlock</a>();
key_pressed.<a href="#wakeAll">wakeAll</a>();
}
</pre>
<p> 互斥量是必須的,因為兩個線程試圖同時對同一個變量進行修改的結果是不可預知的。
<p> <p>也可以參考<a href="environment.html">環境類</a>和<a href="thread.html">線程類</a>。
<hr><h2>成員函數文檔</h2>
<h3 class=fn><a name="QWaitCondition"></a>QWaitCondition::QWaitCondition ()
</h3>
構造一個新的事件信號傳輸,比如,等待條件,對象。
<h3 class=fn><a name="~QWaitCondition"></a>QWaitCondition::~QWaitCondition ()<tt> [虛]</tt>
</h3>
刪除這個事件信號傳輸,比如,等待條件,對象。
<h3 class=fn>bool <a name="wait"></a>QWaitCondition::wait ( unsigned long time = ULONG_MAX )
</h3>
在線程事件對象上等待。調用這個的線程將會阻塞,直到下列條件之一滿足時才醒來:
<ul>
<li> 另一個線程使用<a href="#wakeOne">wakeOne</a>()或<a href="#wakeAll">wakeAll</a>()傳輸信號給它。在這種情況下,這個函數將返回真。
<li> <em>time</em>毫秒過去了。如果<em>time</em>為ULONG_MAX(默認值),那么這個等待將永遠不會超時(這個事件必須被傳輸)。如果等待的事件超時,這個函數將會返回假。
</ul>
<p> <p>也可以參考<a href="#wakeOne">wakeOne</a>()和<a href="#wakeAll">wakeAll</a>()。
<h3 class=fn>bool <a name="wait-2"></a>QWaitCondition::wait ( <a href="qmutex.html">QMutex</a> * mutex, unsigned long time = ULONG_MAX )
</h3>
這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。
<p> 釋放鎖定的<em>mutex</em>并且在線程事件對象上等待。<em>mutex</em>必須由調用線程初始鎖定的。如果<em>mutex</em>沒有在鎖定狀態,這個函數立即返回。如果<em>mutex</em>是一個遞歸互斥量,這個函數立即返回。<em>mutex</em>將被解鎖,并且調用線程將會阻塞,直到下列條件之一滿足時才醒來:
<ul>
<li> 另一個線程使用<a href="#wakeOne">wakeOne</a>()或<a href="#wakeAll">wakeAll</a>()傳輸信號給它。在這種情況下,這個函數將返回真。
<li> <em>time</em>毫秒過去了。如果<em>time</em>為ULONG_MAX(默認值),那么這個等待將永遠不會超時(這個事件必須被傳輸)。如果等待的事件超時,這個函數將會返回假。
</ul>
<p> 互斥量將以同樣的鎖定狀態返回。這個函數提供的是允許從鎖定狀態到等待狀態的原子轉換。
<p> <p>也可以參考<a href="#wakeOne">wakeOne</a>()和<a href="#wakeAll">wakeAll</a>()。
<h3 class=fn>void <a name="wakeAll"></a>QWaitCondition::wakeAll ()
</h3>
這將會喚醒所有等待QWaitCondition的線程。這些線程被喚醒的順序依賴于操組系統的調度策略,并且不能被控制或預知。
<p> <p>也可以參考<a href="#wakeOne">wakeOne</a>()。
<h3 class=fn>void <a name="wakeOne"></a>QWaitCondition::wakeOne ()
</h3>
這將會喚醒所有等待QWaitCondition的線程中的一個線程。這個被喚醒的線程依賴于操組系統的調度策略,并且不能被控制或預知。
<p> <p>也可以參考<a href="#wakeAll">wakeAll</a>()。
<!-- eof -->
<hr><p>
這個文件是<a href="index.html">Qt工具包</a>一部分。
版權所有 © 1995-2002
<a href="http://www.trolltech.com/">Trolltech</a>。保留所有權利。
<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>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -