• <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)  編輯 收藏 引用 所屬分類: 多線程
            2022年国产精品久久久久| 97精品国产91久久久久久| 免费精品久久久久久中文字幕| 久久亚洲国产精品123区| 久久精品成人欧美大片| 97热久久免费频精品99| 久久精品国产亚洲Aⅴ香蕉 | 亚洲精品WWW久久久久久| 久久久久久久久久久| 国产日韩欧美久久| 日日躁夜夜躁狠狠久久AV| 久久国产综合精品五月天| 午夜精品久久久久久毛片| 三级片免费观看久久| 国产精品日韩欧美久久综合| 久久久久久久女国产乱让韩 | 伊人久久大香线蕉AV一区二区| 国产午夜免费高清久久影院| 久久无码专区国产精品发布| 嫩草影院久久99| 狠狠色丁香婷婷久久综合不卡| 国内精品人妻无码久久久影院导航 | 久久久久这里只有精品 | 思思久久精品在热线热| 办公室久久精品| 九九久久99综合一区二区| 婷婷久久久亚洲欧洲日产国码AV | 国产叼嘿久久精品久久| 九九精品99久久久香蕉| 综合人妻久久一区二区精品| 一本久道久久综合狠狠躁AV| 亚洲国产视频久久| 久久久久久久久久久| 亚州日韩精品专区久久久| 久久综合日本熟妇| 久久精品国产色蜜蜜麻豆| 久久人妻少妇嫩草AV无码蜜桃| 久久国产成人精品国产成人亚洲| 国产成人无码精品久久久免费| 97超级碰碰碰碰久久久久| 久久久精品国产亚洲成人满18免费网站 |