亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? threads.html

?? Linux下Qt編程的電子書
?? 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/doc/threads.doc:36 -->
<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>Qt中的線程支持</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>Qt中的線程支持</h1>

 
<p> Qt對線程提供了支持,基本形式有獨立于平臺的線程類、線程安全方式的事件傳遞和一個全局Qt庫互斥量允許你可以從不同的線程調(diào)用Qt方法。
<p> 這個文檔是提供給那些對多線程編程有豐富的知識和經(jīng)驗的聽眾的。推薦閱讀:
<ul>
<li> <a href="http://www.amazon.com/exec/obidos/ASIN/0134436989/trolltech/t">Threads Primer: A Guide to Multithreaded Programming</a>
<li> <a href="http://www.amazon.com/exec/obidos/ASIN/0131900676/trolltech/t">Thread Time: The Multithreaded Programming Guide</a>
<li> <a href="http://www.amazon.com/exec/obidos/ASIN/1565921151/trolltech/t">Pthreads Programming: A POSIX Standard for Better Multiprocessing (O'Reilly Nutshell)</a>
<li> <a href="http://www.amazon.com/exec/obidos/ASIN/1565922964/trolltech/t">Win32 Multithreaded Programming</a>
</ul>
<p> <b>警告:</b>所有的GUI類(比如,<a href="qwidget.html">QWidget</a>和它的子類),操作系統(tǒng)核心類(比如,<a href="qprocess.html">QProcess</a>)和網(wǎng)絡(luò)類都<em>不</em>是線程安全的。
<p> <a href="qregexp.html">QRegExp</a>使用一個靜態(tài)緩存并且也不是線程安全的,即使通過使用<a href="qmutex.html">QMutex</a>來保護的QRegExp對象。
<p> 
<p> <h2> 啟用線程支持
</h2>
<a name="1"></a><p> 在Windows上安裝Qt時,在一些編譯器上線程支持是一個選項。
<p> 在Mac OS X和Unix上,線程支持可以當你在運行<tt>configure</tt>腳本時添加<tt>-thread</tt>選項就可以生效了。在Unix平臺上,多線程程序必須用特殊的方式連接,比如使用特殊的libc,安裝程序?qū)?chuàng)建另外一個庫<tt>libqt-mt</tt>并且因此線程程序必須和這個庫進行連接(使用<tt>-lqt-mt</tt>)而不是標準的Qt庫。
<p> 在兩個平臺上,你都應(yīng)該定義宏<tt>QT_THREAD_SUPPORT</tt>來編譯(比如,編譯時使用<tt>-DQT_THREAD_SUPPORT</tt>)。在Windows上,這個通常可以在<tt>qconfig.h</tt>寫一個條目來解決。
<p> <h2> 線程類
</h2>
<a name="2"></a><p> 最重要的類是<a href="qthread.html">QThread</a>,也就是說要開始一個新的線程,就是開始執(zhí)行你重新實現(xiàn)的<a href="qthread.html#run">QThread::run</a>()。這和Java的線程類很相似。
<p> 為了寫線程程序,在兩個線程同時希望訪問同一個數(shù)據(jù)時,對數(shù)據(jù)進行保護是很必要的。因此這里也有一個<a href="qmutex.html">QMutex</a>類,一個線程可以鎖定互斥量,并且在它鎖定之后,其它線程就不能再鎖定這個互斥量了,試圖這樣做的線程都會被阻塞直到互斥量被釋放。例如:
<p> <pre>
    class MyClass
    {
    public:
        void doStuff( int );

    private:
        <a href="qmutex.html">QMutex</a> mutex;
        int a;
        int b;
    };

    // 這里設(shè)置a為c,b為c*2。

    void MyClass::doStuff( int c )
    {
        mutex.<a href="qmutex.html#lock">lock</a>();
        a = c;
        b = c * 2;
        mutex.<a href="qmutex.html#unlock">unlock</a>();
    } 
</pre>
 
<p> 這保證了同一時間只有一個線程可以進入MyClass::doStuff(),所以<tt>b</tt>將永遠等于<tt>c * 2</tt>。
<p> 另外一個線程也需要在一個給定的條件下等待其它線程的喚醒,<a href="qwaitcondition.html">QWaitCondition</a>類就被提供了。線程等待的條件QWaitCondition指出發(fā)生了什么事情,阻塞將一直持續(xù)到這種事情發(fā)生。當某種事情發(fā)生了,<a href="qwaitcondition.html">QWaitCondition</a>可以喚醒等待這一事件的線程之一或全部。(這和POSIX線程條件變量是具有相同功能的并且它也是Unix上的一種實現(xiàn)。)例如:
<p> <pre>
    #include &lt;<a href="qapplication-h.html">qapplication.h</a>&gt;
    #include &lt;<a href="qpushbutton-h.html">qpushbutton.h</a>&gt;

    // 全局條件變量
    <a href="qwaitcondition.html">QWaitCondition</a> mycond;

    // Worker類實現(xiàn)
    class Worker : public <a href="qpushbutton.html">QPushButton</a>, public QThread
    {
        <a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a>

    public:
        Worker(QWidget *parent = 0, const char *name = 0)
            : <a href="qpushbutton.html">QPushButton</a>(parent, name)
        {
            setText("Start Working");

            // 連接從QPushButton繼承來的信號和我們的slotClicked()方法
            connect(this, SIGNAL(clicked()), SLOT(slotClicked()));

            // 調(diào)用從QThread繼承來的start()方法……這將立即開始線程的執(zhí)行
            QThread::<a href="qthread.html#start">start</a>();
        }

    public slots:
        void slotClicked()
        {
            // 喚醒等待這個條件變量的一個線程
            mycond.<a href="qwaitcondition.html#wakeOne">wakeOne</a>();
        }

    protected:
        void run()
        {
            // 這個方法將被新創(chuàng)建的線程調(diào)用……

            while ( TRUE ) {
                // 鎖定應(yīng)用程序互斥鎖,并且設(shè)置窗口標題來表明我們正在等待開始工作
                qApp-&gt;<a href="qapplication.html#lock">lock</a>();
                setCaption( "Waiting" );
                qApp-&gt;<a href="qapplication.html#unlock">unlock</a>();

                // 等待直到我們被告知可以繼續(xù)
                mycond.<a href="qwaitcondition.html#wait">wait</a>();

                // 如果我們到了這里,我們已經(jīng)被另一個線程喚醒……讓我們來設(shè)置標題來表明我們正在工作
                qApp-&gt;<a href="qapplication.html#lock">lock</a>();
                setCaption( "Working!" );
                qApp-&gt;<a href="qapplication.html#unlock">unlock</a>();

                // 這可能會占用一些時間,幾秒、幾分鐘或者幾小時等等,因為這個一個和GUI線程分開的線程,在處理事件時,GUI線程不會停下來……
                do_complicated_thing();
            }
        }
    };

	// 主線程——所有的GUI事件都由這個線程處理。
    int main( int argc, char **argv )
    {
        <a href="qapplication.html">QApplication</a> app( argc, argv );

        // 創(chuàng)建一個worker……當我們這樣做的時候,這個worker將在一個線程中運行
        Worker firstworker( 0, "worker" );

        app.<a href="qapplication.html#setMainWidget">setMainWidget</a>( &amp;worker );
        worker.show();

        return app.<a href="qapplication.html#exec">exec</a>();
    }
  </pre>
 
<p> 只要你按下按鈕,這個程序就會喚醒worker線程,這個線程將會進行并且做一些工作并且然后會回來繼續(xù)等待被告知做更多的工作。如果當按鈕被按下時,worker線程正在工作,那么就什么也不會發(fā)生。當線程完成了工作并且再次調(diào)用<a href="qwaitcondition.html#wait">QWaitCondition::wait</a>(),然后它就會被開始。
<p> <h2> 線程安全的事件傳遞
</h2>
<a name="3"></a><p> 在Qt中,一個線程總是一個事件線程——確實是這樣的,線程從窗口系統(tǒng)中拉出事件并且把它們分發(fā)給窗口部件。靜態(tài)方法QThread::postEvent從線程中傳遞事件,而不同于事件線程。事件線程被喚醒并且事件就像一個普通窗口系統(tǒng)事件那樣在事件線程中被分發(fā)。例如,你可以強制一個窗口部件通過如下這樣做的一個不同的線程來進行重繪:
<p> <pre>
    <a href="qwidget.html">QWidget</a> *mywidget;
    QThread::<a href="qthread.html#postEvent">postEvent</a>( mywidget, new <a href="qpaintevent.html">QPaintEvent</a>( QRect(0, 0, 100, 100) ) );
  </pre>
 
<p> 這(異步地)將使mywidget重繪一塊100*100的正方形區(qū)域。
<p> <h2> Qt庫互斥量
</h2>
<a name="4"></a><p> Qt庫互斥量提供了從線程而不是事件線程中調(diào)用Qt方法的一種方法。例如:
<p> <pre>
  <a href="qapplication.html">QApplication</a> *qApp;
  <a href="qwidget.html">QWidget</a> *mywidget;

  qApp-&gt;<a href="qapplication.html#lock">lock</a>();

  mywidget-&gt;<a href="qwidget.html#setGeometry">setGeometry</a>(0,0,100,100);

  <a href="qpainter.html">QPainter</a> p;
  p.<a href="qpainter.html#begin">begin</a>(mywidget);
  p.<a href="qpainter.html#drawLine">drawLine</a>(0,0,100,100);
  p.<a href="qpainter.html#end">end</a>();

  qApp-&gt;<a href="qapplication.html#unlock">unlock</a>();
  </pre>
 
<p> 在Qt中沒有使用互斥量而調(diào)用一個函數(shù)通常情況下結(jié)果將是不可預知的。從另外一個線程中調(diào)用Qt的一個GUI相關(guān)函數(shù)需要使用Qt庫互斥量。在這種情況下,所有可能最終訪問任何圖形或者窗口系統(tǒng)資源的都是GUI相關(guān)的。使用容器類,字符串或者輸入/輸出類,如果對象只被一個線程使用就不需要任何互斥量了。
<p> <h2> 告誡
</h2>
<a name="5"></a><p> 當進行線程編程時,需要注意的一些事情:
<ul>
<li> 當使用Qt庫互斥量的時候不要做任何阻塞操作。這將會凍結(jié)事件循環(huán)。
<p> <li> 確認你鎖定一個遞歸<a href="qmutex.html">QMutex</a>的次數(shù)和解鎖的次數(shù)一樣,不能多也不能少。
<p> <li> 在調(diào)用除了Qt容器和工具類的任何東西之前鎖定Qt應(yīng)用程序互斥量。
<p> <li> 謹防<a href="shclass.html#implicitly-shared">隱含地共享</a>類,你應(yīng)該避免在線程之間使用操作符=()來復制它們。這將會在Qt的未來主要的或次要的發(fā)行版本中進行改進。
<p> <li> 謹防那些沒有被設(shè)計為線程安全的Qt類,例如,<a href="qptrlist.html">QPtrList</a>的應(yīng)用程序接口就不是線程安全的并且如果不同的線程需要遍歷一個QPtrList,它們應(yīng)該在調(diào)用<a href="qptrlist.html#first">QPtrList::first</a>()之前鎖定并且在到達終點之后解鎖,而不是在<a href="qptrlist.html#next">QPtrList::next</a>()的前后進行鎖定和解鎖。
<p> <li> 確認只在GUI線程中創(chuàng)建的繼承和使用了<a href="qwidget.html">QWidget</a>、<a href="qtimer.html">QTimer</a>和<a href="qsocketnotifier.html">QSocketNotifier</a>的對象。在一些平臺上,在某個不是GUI線程的線程中創(chuàng)建這樣的對象將永遠不會接受到底層窗口系統(tǒng)的事件。
<p> <li> 和上面很相似,只在GUI線程中使用QNetwork類。一個經(jīng)常被問到的問題是一個<a href="qsocket.html">QSocket</a>是否可以在多線程中使用。這不是必須得,因為所有的QNetwork類都是異步的。
<p> <li> 不要在不是GUI線程的線程中試圖調(diào)用processEvents()函數(shù)。這也包括<a href="qdialog.html#exec">QDialog::exec</a>()、<a href="qpopupmenu.html#exec">QPopupMenu::exec</a>()、<a href="qapplication.html#processEvents">QApplication::processEvents</a>()和其它一些。
<p> <li> 在你的應(yīng)用程序中,不要把普通的Qt庫和支持線程的Qt庫混合使用。這也就是說如果你的程序使用了支持線程的Qt庫,你就不應(yīng)該連接普通的Qt庫、動態(tài)的載入普通Qt庫或者動態(tài)地連接其它依賴普通Qt庫的庫或者插件。在一些系統(tǒng)上,這樣做會導致Qt庫中使用的靜態(tài)數(shù)據(jù)變得不可靠了。
<p> </ul>
<p> 
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright &copy; 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 + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
k8久久久一区二区三区| 国产午夜亚洲精品不卡| 亚洲精品在线电影| 亚洲精品日韩综合观看成人91| 男男成人高潮片免费网站| 色综合一个色综合| 亚洲国产电影在线观看| 狠狠色狠狠色综合日日91app| 精品视频资源站| 亚洲蜜臀av乱码久久精品| 国产成人av电影在线| 欧美精品一区二| 石原莉奈一区二区三区在线观看| 91一区二区三区在线播放| 国产三级一区二区三区| 久久99久久99精品免视看婷婷| 欧美日韩精品系列| 亚洲人成精品久久久久久| 不卡一区二区在线| 国产人伦精品一区二区| 国产精品亚洲成人| 久久久午夜电影| 国产一区二区在线免费观看| 日韩欧美二区三区| 蜜臀久久久久久久| 日韩美女视频在线| 久久精品国产久精国产| 日韩欧美国产一区二区三区| 日韩av不卡一区二区| 欧美福利一区二区| 奇米色一区二区三区四区| 欧美一级xxx| 久久99国产精品成人| 久久日韩精品一区二区五区| 精品一区二区三区不卡 | 亚洲高清一区二区三区| 日本道精品一区二区三区| 亚洲裸体在线观看| 欧美在线免费观看视频| 亚洲成人tv网| 日韩精品一区二区三区老鸭窝 | 久久综合色天天久久综合图片| 全部av―极品视觉盛宴亚洲| 91精品国产综合久久国产大片 | 色偷偷成人一区二区三区91 | 国产永久精品大片wwwapp| 日韩一级精品视频在线观看| 麻豆精品久久久| 久久精品视频在线免费观看| 99国产欧美久久久精品| 亚洲黄色av一区| 欧美一区二区免费观在线| 韩国毛片一区二区三区| 中文一区二区完整视频在线观看| 91日韩在线专区| 天天av天天翘天天综合网 | 一区二区国产盗摄色噜噜| 欧美日韩国产综合一区二区三区| 日韩成人一级大片| 久久久久国产精品人| 色av综合在线| 狠狠狠色丁香婷婷综合激情 | 欧美主播一区二区三区美女| 日本aⅴ精品一区二区三区| 国产日韩视频一区二区三区| 日本高清不卡aⅴ免费网站| 麻豆中文一区二区| 国产精品黄色在线观看 | 91亚洲精品久久久蜜桃网站| 日日夜夜一区二区| 国产丝袜欧美中文另类| 欧美视频在线一区二区三区| 国产成人综合精品三级| 亚洲综合精品自拍| 国产欧美日韩另类一区| 欧美一区二区三区小说| 成人国产精品免费观看| 久久精品国产99久久6| 亚洲欧美另类久久久精品| 欧美va在线播放| 日本电影亚洲天堂一区| 国产ts人妖一区二区| 舔着乳尖日韩一区| 一区二区三区视频在线看| 国产欧美精品一区二区三区四区 | 欧美极品aⅴ影院| 91精品蜜臀在线一区尤物| 成人激情综合网站| 黑人精品欧美一区二区蜜桃 | 亚洲综合视频网| 日本一区免费视频| 欧美大黄免费观看| 91精品国产91久久久久久最新毛片| jvid福利写真一区二区三区| 国产黄人亚洲片| 久久精品国产精品亚洲精品| 偷拍日韩校园综合在线| 一级做a爱片久久| 亚洲人成在线播放网站岛国 | 男人的天堂亚洲一区| 亚洲久草在线视频| 中文欧美字幕免费| 欧美国产激情一区二区三区蜜月| 欧美大片国产精品| 精品日本一线二线三线不卡| 日韩视频在线永久播放| 欧美一区二区三区在线视频| 欧美狂野另类xxxxoooo| 欧美日韩一本到| 在线不卡中文字幕| 91麻豆精品国产91久久久使用方法 | 91精品国产全国免费观看| 在线免费观看日韩欧美| 在线精品亚洲一区二区不卡| 国产精品久久久久国产精品日日| 韩国视频一区二区| 精品欧美一区二区三区精品久久| 欧美色男人天堂| 欧美日韩一区二区三区高清| 欧美男人的天堂一二区| 欧美日韩视频不卡| 欧美久久久久免费| 日韩精品一区二区三区在线| 久久综合精品国产一区二区三区 | 国产丝袜在线精品| 日本一区二区三区四区在线视频| 欧美精彩视频一区二区三区| 国产精品少妇自拍| 亚洲人精品一区| 午夜精品成人在线| 久久不见久久见免费视频7| 国产美女精品一区二区三区| 成人在线视频一区| 99精品视频在线播放观看| 在线观看亚洲一区| 欧美一卡二卡三卡| 久久久亚洲高清| 一区二区在线电影| 色综合色综合色综合色综合色综合| 久久日韩精品一区二区五区| 日韩一区二区免费高清| 精品国产乱码久久久久久闺蜜 | 久久久久国产一区二区三区四区| 国产亚洲精品超碰| 亚洲久草在线视频| 蜜桃精品在线观看| 成人爱爱电影网址| 在线电影国产精品| 国产日韩欧美精品在线| 一区二区三区在线免费| 久久99精品网久久| 国内外成人在线视频| 福利一区在线观看| 精品视频一区三区九区| 久久夜色精品一区| 亚洲国产综合视频在线观看| 国产一区亚洲一区| 在线观看三级视频欧美| 久久久久久久精| 五月综合激情网| 97久久精品人人做人人爽50路 | 亚洲色图.com| 九色综合狠狠综合久久| 欧美在线|欧美| 国产日韩精品久久久| 污片在线观看一区二区| 91蝌蚪porny| 久久久.com| 蜜桃91丨九色丨蝌蚪91桃色| 日本电影欧美片| 亚洲国产成人私人影院tom| 日韩avvvv在线播放| 日本韩国欧美三级| 国产精品大尺度| 国产精品亚洲综合一区在线观看| 91精品国产综合久久久久久久久久| 亚洲欧美在线高清| 国产精品18久久久久| 日韩欧美区一区二| 日韩av一区二区三区四区| 91精品福利视频| 亚洲色图欧美激情| 暴力调教一区二区三区| 久久久久久久久久久久电影| 久久丁香综合五月国产三级网站| 欧美日韩免费高清一区色橹橹| 亚洲欧美经典视频| jiyouzz国产精品久久| 国产女主播视频一区二区| 国产丶欧美丶日本不卡视频| 久久综合九色欧美综合狠狠| 精品一区二区三区在线播放| 日韩一区二区精品葵司在线 | 午夜精品福利一区二区三区蜜桃| 色综合久久天天| 一区二区三区中文在线观看| 99国产精品久久久久久久久久久 | 在线观看国产一区二区| 一区二区免费在线| 精品视频免费在线|