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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? threads.html

?? QT3.0.5的幫助文檔的中文翻譯
?? 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">函數</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庫互斥量允許你可以從不同的線程調用Qt方法。
<p> 這個文檔是提供給那些對多線程編程有豐富的知識和經驗的聽眾的。推薦閱讀:
<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>和它的子類),操作系統核心類(比如,<a href="qprocess.html">QProcess</a>)和網絡類都<em>不</em>是線程安全的。
<p> <a href="qregexp.html">QRegExp</a>使用一個靜態緩存并且也不是線程安全的,即使通過使用<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,安裝程序將會創建另外一個庫<tt>libqt-mt</tt>并且因此線程程序必須和這個庫進行連接(使用<tt>-lqt-mt</tt>)而不是標準的Qt庫。
<p> 在兩個平臺上,你都應該定義宏<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>,也就是說要開始一個新的線程,就是開始執行你重新實現的<a href="qthread.html#run">QThread::run</a>()。這和Java的線程類很相似。
<p> 為了寫線程程序,在兩個線程同時希望訪問同一個數據時,對數據進行保護是很必要的。因此這里也有一個<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;
    };

    // 這里設置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指出發生了什么事情,阻塞將一直持續到這種事情發生。當某種事情發生了,<a href="qwaitcondition.html">QWaitCondition</a>可以喚醒等待這一事件的線程之一或全部。(這和POSIX線程條件變量是具有相同功能的并且它也是Unix上的一種實現。)例如:
<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類實現
    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()));

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

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

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

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

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

                // 如果我們到了這里,我們已經被另一個線程喚醒……讓我們來設置標題來表明我們正在工作
                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 );

        // 創建一個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線程,這個線程將會進行并且做一些工作并且然后會回來繼續等待被告知做更多的工作。如果當按鈕被按下時,worker線程正在工作,那么就什么也不會發生。當線程完成了工作并且再次調用<a href="qwaitcondition.html#wait">QWaitCondition::wait</a>(),然后它就會被開始。
<p> <h2> 線程安全的事件傳遞
</h2>
<a name="3"></a><p> 在Qt中,一個線程總是一個事件線程——確實是這樣的,線程從窗口系統中拉出事件并且把它們分發給窗口部件。靜態方法QThread::postEvent從線程中傳遞事件,而不同于事件線程。事件線程被喚醒并且事件就像一個普通窗口系統事件那樣在事件線程中被分發。例如,你可以強制一個窗口部件通過如下這樣做的一個不同的線程來進行重繪:
<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的正方形區域。
<p> <h2> Qt庫互斥量
</h2>
<a name="4"></a><p> Qt庫互斥量提供了從線程而不是事件線程中調用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中沒有使用互斥量而調用一個函數通常情況下結果將是不可預知的。從另外一個線程中調用Qt的一個GUI相關函數需要使用Qt庫互斥量。在這種情況下,所有可能最終訪問任何圖形或者窗口系統資源的都是GUI相關的。使用容器類,字符串或者輸入/輸出類,如果對象只被一個線程使用就不需要任何互斥量了。
<p> <h2> 告誡
</h2>
<a name="5"></a><p> 當進行線程編程時,需要注意的一些事情:
<ul>
<li> 當使用Qt庫互斥量的時候不要做任何阻塞操作。這將會凍結事件循環。
<p> <li> 確認你鎖定一個遞歸<a href="qmutex.html">QMutex</a>的次數和解鎖的次數一樣,不能多也不能少。
<p> <li> 在調用除了Qt容器和工具類的任何東西之前鎖定Qt應用程序互斥量。
<p> <li> 謹防<a href="shclass.html#implicitly-shared">隱含地共享</a>類,你應該避免在線程之間使用操作符=()來復制它們。這將會在Qt的未來主要的或次要的發行版本中進行改進。
<p> <li> 謹防那些沒有被設計為線程安全的Qt類,例如,<a href="qptrlist.html">QPtrList</a>的應用程序接口就不是線程安全的并且如果不同的線程需要遍歷一個QPtrList,它們應該在調用<a href="qptrlist.html#first">QPtrList::first</a>()之前鎖定并且在到達終點之后解鎖,而不是在<a href="qptrlist.html#next">QPtrList::next</a>()的前后進行鎖定和解鎖。
<p> <li> 確認只在GUI線程中創建的繼承和使用了<a href="qwidget.html">QWidget</a>、<a href="qtimer.html">QTimer</a>和<a href="qsocketnotifier.html">QSocketNotifier</a>的對象。在一些平臺上,在某個不是GUI線程的線程中創建這樣的對象將永遠不會接受到底層窗口系統的事件。
<p> <li> 和上面很相似,只在GUI線程中使用QNetwork類。一個經常被問到的問題是一個<a href="qsocket.html">QSocket</a>是否可以在多線程中使用。這不是必須得,因為所有的QNetwork類都是異步的。
<p> <li> 不要在不是GUI線程的線程中試圖調用processEvents()函數。這也包括<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> 在你的應用程序中,不要把普通的Qt庫和支持線程的Qt庫混合使用。這也就是說如果你的程序使用了支持線程的Qt庫,你就不應該連接普通的Qt庫、動態的載入普通Qt庫或者動態地連接其它依賴普通Qt庫的庫或者插件。在一些系統上,這樣做會導致Qt庫中使用的靜態數據變得不可靠了。
<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一区二区三区免费野_久草精品视频
国产精品久久久久久妇女6080 | 国产91精品免费| 午夜不卡av在线| 综合久久给合久久狠狠狠97色| 国产日韩精品一区二区浪潮av| 欧美tickle裸体挠脚心vk| 国产剧情av麻豆香蕉精品| 亚洲成人激情综合网| 日韩高清一区在线| 国产精品一区在线观看乱码 | 国产精品女上位| 亚洲一区视频在线观看视频| 亚洲国产aⅴ天堂久久| 奇米影视7777精品一区二区| 狠狠色综合色综合网络| 成人性生交大片免费看在线播放| 99久久国产综合精品女不卡| 欧美电影影音先锋| 亚洲区小说区图片区qvod| 偷拍一区二区三区| 成人国产精品免费| 91精品国产91综合久久蜜臀| 国产精品美女www爽爽爽| 麻豆极品一区二区三区| 97精品久久久午夜一区二区三区| 99精品久久免费看蜜臀剧情介绍| 色哟哟国产精品免费观看| 日韩欧美一级片| 麻豆久久久久久| 欧美三级视频在线| 五月天国产精品| 色噜噜偷拍精品综合在线| 国产欧美视频在线观看| 国产精品一区二区视频| 欧美亚洲高清一区| 欧美日韩mp4| 亚洲一区中文在线| 欧美人xxxx| 久久99国产精品免费| 日韩限制级电影在线观看| 亚洲国产欧美在线| 欧美片网站yy| 蜜桃免费网站一区二区三区| 欧美xfplay| 91在线一区二区三区| 天堂午夜影视日韩欧美一区二区| 欧日韩精品视频| 韩国三级中文字幕hd久久精品| 久久久久久免费| 97久久精品人人做人人爽50路| 午夜天堂影视香蕉久久| 日韩一级成人av| 色综合网站在线| 亚洲成人动漫精品| 中文字幕高清不卡| 欧美一区二区视频网站| 99精品久久免费看蜜臀剧情介绍| 有坂深雪av一区二区精品| 国产亚洲一本大道中文在线| 一本久久综合亚洲鲁鲁五月天| 麻豆高清免费国产一区| 亚洲欧美日韩中文字幕一区二区三区 | 日韩电影免费一区| 国产精品久久久一本精品 | 日韩精品综合一本久道在线视频| jlzzjlzz亚洲女人18| 国产福利一区二区| 精品亚洲国产成人av制服丝袜 | 欧美日韩免费电影| aaa亚洲精品| av一本久道久久综合久久鬼色| 精品一区精品二区高清| 国产自产v一区二区三区c| 麻豆精品新av中文字幕| 国产一区二区免费视频| 久久69国产一区二区蜜臀| 久久精品国产第一区二区三区| 午夜精品久久久久久久| 日韩av午夜在线观看| 日本亚洲三级在线| 国产精品原创巨作av| 成人一级片在线观看| 成人成人成人在线视频| 色综合亚洲欧洲| 91麻豆精品国产无毒不卡在线观看| 欧美日韩国产首页| 久久精品亚洲麻豆av一区二区| 国产精品国产三级国产a| 一区二区不卡在线播放 | 91豆麻精品91久久久久久| 欧美日韩久久不卡| 久久久精品国产99久久精品芒果| 久久久久久久av麻豆果冻| 亚洲免费观看在线视频| 美女诱惑一区二区| 91小视频免费看| 精品乱人伦一区二区三区| 欧美日韩一级二级| 国产精品18久久久久久久久| 裸体在线国模精品偷拍| 91亚洲男人天堂| 久久久99免费| 国产伦精品一区二区三区免费迷| 一本大道久久a久久综合| 久久久亚洲精品石原莉奈| 日本免费新一区视频| 91美女视频网站| 国产精品剧情在线亚洲| 高清成人在线观看| 国产偷国产偷亚洲高清人白洁| 亚洲第一av色| 精品视频免费在线| 香蕉成人啪国产精品视频综合网| 色www精品视频在线观看| 亚洲欧美综合色| 欧美色大人视频| 亚洲丶国产丶欧美一区二区三区| 欧美性大战久久久久久久蜜臀| 亚洲精品免费在线观看| 色就色 综合激情| 丝袜诱惑制服诱惑色一区在线观看| 在线视频中文字幕一区二区| 亚洲国产成人tv| 久久精品一区蜜桃臀影院| 成人免费毛片片v| 亚洲国产日韩一区二区| 欧美一区二区三区在| 成人中文字幕合集| 石原莉奈在线亚洲三区| 精品欧美久久久| 91视频91自| 国产精品一区二区久久不卡| 亚洲理论在线观看| 国产欧美日韩三级| 欧美福利视频一区| 色婷婷久久久久swag精品| 视频一区欧美精品| 亚洲裸体xxx| 国产欧美精品国产国产专区| 欧美三级视频在线播放| 北条麻妃国产九九精品视频| 国产一区二区三区视频在线播放| 一区二区三区在线视频免费| 久久精品欧美一区二区三区不卡| 欧美性猛交一区二区三区精品| 成人动漫中文字幕| www.av亚洲| 国产欧美日韩不卡| 国产喷白浆一区二区三区| 日韩欧美一级片| 精品国产一区久久| 日韩欧美国产一二三区| 精品国产a毛片| 久久久国产精华| 国产精品久久久久久一区二区三区| 久久久亚洲高清| 亚洲国产精品精华液ab| 国产精品久久看| 五月婷婷综合在线| 午夜a成v人精品| 狠狠色丁香婷综合久久| 成人免费看视频| 欧美日韩精品欧美日韩精品一综合| 欧美伊人精品成人久久综合97| 欧美老人xxxx18| 精品久久五月天| 夜夜精品视频一区二区| 蜜桃视频免费观看一区| 国产suv精品一区二区883| 欧美日韩国产一级片| 久久免费视频色| 青草国产精品久久久久久| 懂色av中文字幕一区二区三区| 欧美日韩亚洲国产综合| 久久精品男人天堂av| 蜜桃在线一区二区三区| 91在线码无精品| 中文字幕中文在线不卡住| 日韩av不卡一区二区| 色婷婷国产精品综合在线观看| 久久蜜桃av一区精品变态类天堂 | 日韩精品一区二区三区中文不卡 | 亚洲国产日日夜夜| www.成人在线| 国产精品网站一区| 国产成人免费视| 久久色视频免费观看| 九九精品视频在线看| 精品乱人伦一区二区三区| 婷婷国产在线综合| 欧美一区二区三区视频免费| 亚洲资源在线观看| 精品一区二区三区在线播放| 91精品久久久久久久91蜜桃| 亚洲第一主播视频| 日韩欧美亚洲另类制服综合在线| 日韩不卡在线观看日韩不卡视频| 91精品国产高清一区二区三区蜜臀| 亚洲午夜一区二区| 精品国产制服丝袜高跟|