• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            WIN32線程控制主要實現(xiàn)線程的創(chuàng)建、終止、掛起和恢復(fù)等操作,這些操作都依賴于WIN32提供的一組API和具體編譯器的C運行時庫函數(shù)。
              WIN32線程控制主要實現(xiàn)線程的創(chuàng)建、終止、掛起和恢復(fù)等操作,這些操作都依賴于WIN32提供的一組API和具體編譯器的C運行時庫函數(shù)。

              1.線程函數(shù)

              在啟動一個線程之前,必須為線程編寫一個全局的線程函數(shù),這個線程函數(shù)接受一個32位的LPVOID作為參數(shù),返回一個UINT,線程函數(shù)的結(jié)構(gòu)為:

            UINT ThreadFunction(LPVOID pParam)
            {
             //線程處理代碼
             return0;
            }

              在線程處理代碼部分通常包括一個死循環(huán),該循環(huán)中先等待某事情的發(fā)生,再處理相關(guān)的工作:

            while(1)
            {
             WaitForSingleObject(…,…);//或WaitForMultipleObjects(…)
             //Do something
            }

              一般來說,C++的類成員函數(shù)不能作為線程函數(shù)。這是因為在類中定義的成員函數(shù),編譯器會給其加上this指針。請看下列程序:

            #include "windows.h"
            #include <process.h>
            class ExampleTask
            {
             public:
              void taskmain(LPVOID param);
              void StartTask();
            };
            void ExampleTask::taskmain(LPVOID param)
            {}

            void ExampleTask::StartTask()
            {
             _beginthread(taskmain,0,NULL);
            }

            int main(int argc, char* argv[])
            {
             ExampleTask realTimeTask;
             realTimeTask.StartTask();
             return 0;
            }

              程序編譯時出現(xiàn)如下錯誤:

            error C2664: '_beginthread' : cannot convert parameter 1 from 'void (void *)' to 'void (__cdecl *)(void *)'
            None of the functions with this name in scope match the target type

              再看下列程序:

            #include "windows.h"
            #include <process.h>
            class ExampleTask
            {
             public:
              void taskmain(LPVOID param);
            };

            void ExampleTask::taskmain(LPVOID param)
            {}

            int main(int argc, char* argv[])
            {
             ExampleTask realTimeTask;
             _beginthread(ExampleTask::taskmain,0,NULL);
             return 0;
            }

              程序編譯時會出錯:

            error C2664: '_beginthread' : cannot convert parameter 1 from 'void (void *)' to 'void (__cdecl *)(void *)'
            None of the functions with this name in scope match the target type

              如果一定要以類成員函數(shù)作為線程函數(shù),通常有如下解決方案:

              (1)將該成員函數(shù)聲明為static類型,去掉this指針;

              我們將上述二個程序改變?yōu)椋?br />
            #include "windows.h"
            #include <process.h>
            class ExampleTask
            {
             public:
              void static taskmain(LPVOID param);
              void StartTask();
            };

            void ExampleTask::taskmain(LPVOID param)
            {}

            void ExampleTask::StartTask()
            {
             _beginthread(taskmain,0,NULL);
            }

            int main(int argc, char* argv[])
            {
             ExampleTask realTimeTask;
             realTimeTask.StartTask();
             return 0;
            }

            #include "windows.h"
            #include <process.h>
            class ExampleTask
            {
             public:
              void static taskmain(LPVOID param);
            };

            void ExampleTask::taskmain(LPVOID param)
            {}

            int main(int argc, char* argv[])
            {
             _beginthread(ExampleTask::taskmain,0,NULL);
             return 0;
            }

              均編譯通過。

              將成員函數(shù)聲明為靜態(tài)雖然可以解決作為線程函數(shù)的問題,但是它帶來了新的問題,那就是static成員函數(shù)只能訪問static成員。解決此問題的一種途徑是可以在調(diào)用類靜態(tài)成員函數(shù)(線程函數(shù))時將this指針作為參數(shù)傳入,并在改線程函數(shù)中用強制類型轉(zhuǎn)換將this轉(zhuǎn)換成指向該類的指針,通過該指針訪問非靜態(tài)成員。

              (2)不定義類成員函數(shù)為線程函數(shù),而將線程函數(shù)定義為類的友元函數(shù)。這樣,線程函數(shù)也可以有類成員函數(shù)同等的權(quán)限;

              我們將程序修改為:

            #include "windows.h"
            #include <process.h>
            class ExampleTask
            {
             public:
              friend void taskmain(LPVOID param);
              void StartTask();
            };

            void taskmain(LPVOID param)
            {
             ExampleTask * pTaskMain = (ExampleTask *) param;
             //通過pTaskMain指針引用
            }

            void ExampleTask::StartTask()
            {
             _beginthread(taskmain,0,this);
            }
            int main(int argc, char* argv[])
            {
             ExampleTask realTimeTask;
             realTimeTask.StartTask();
             return 0;
            }

              (3)可以對非靜態(tài)成員函數(shù)實現(xiàn)回調(diào),并訪問非靜態(tài)成員,此法涉及到一些高級技巧,在此不再詳述。
            Posted on 2006-11-18 14:20 艾凡赫 閱讀(737) 評論(0)  編輯 收藏 引用 所屬分類: 多線程
            久久99精品国产麻豆宅宅| 久久夜色精品国产亚洲| 国产精品综合久久第一页| 97久久久久人妻精品专区| 超级97碰碰碰碰久久久久最新 | 久久成人18免费网站| 久久天堂电影网| 7国产欧美日韩综合天堂中文久久久久 | 亚洲人成伊人成综合网久久久| 亚洲国产婷婷香蕉久久久久久| 久久人人超碰精品CAOPOREN| 亚洲国产精品无码久久久久久曰| 亚洲欧洲中文日韩久久AV乱码| 武侠古典久久婷婷狼人伊人| 国产偷久久久精品专区| 久久精品无码专区免费青青| 伊人色综合久久| 欧美久久综合九色综合| 久久人人爽人人爽人人av东京热| 亚洲综合熟女久久久30p| 久久久老熟女一区二区三区| 久久精品一区二区三区不卡| 久久中文字幕视频、最近更新| 国产精品久久久久a影院| 狠狠干狠狠久久| 亚洲第一永久AV网站久久精品男人的天堂AV| 中文字幕久久精品 | 国产午夜精品久久久久九九电影| 亚洲午夜无码AV毛片久久| 久久99精品久久久久子伦| 欧美精品丝袜久久久中文字幕 | 狠狠色婷婷久久综合频道日韩 | 久久久噜噜噜久久| 国内精品久久久久影院一蜜桃| 精品久久久久久久久久久久久久久 | 偷窥少妇久久久久久久久| 久久线看观看精品香蕉国产| 久久综合色之久久综合| 日本三级久久网| 人妻少妇久久中文字幕| 久久久久久久国产免费看|