• <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線程控制主要實現線程的創建、終止、掛起和恢復等操作,這些操作都依賴于WIN32提供的一組API和具體編譯器的C運行時庫函數。
              WIN32線程控制主要實現線程的創建、終止、掛起和恢復等操作,這些操作都依賴于WIN32提供的一組API和具體編譯器的C運行時庫函數。

              1.線程函數

              在啟動一個線程之前,必須為線程編寫一個全局的線程函數,這個線程函數接受一個32位的LPVOID作為參數,返回一個UINT,線程函數的結構為:

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

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

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

              一般來說,C++的類成員函數不能作為線程函數。這是因為在類中定義的成員函數,編譯器會給其加上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;
            }

              程序編譯時出現如下錯誤:

            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

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

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

              我們將上述二個程序改變為:

            #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;
            }

              均編譯通過。

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

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

              我們將程序修改為:

            #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)可以對非靜態成員函數實現回調,并訪問非靜態成員,此法涉及到一些高級技巧,在此不再詳述。
            Posted on 2006-11-18 14:20 艾凡赫 閱讀(721) 評論(0)  編輯 收藏 引用 所屬分類: 多線程
            亚洲中文字幕无码久久2020| 精品久久久无码21p发布| 女人香蕉久久**毛片精品| 国内精品久久久久久久久| 精品久久久久久中文字幕大豆网| 无码日韩人妻精品久久蜜桃| 国产精品成人无码久久久久久| 久久99久国产麻精品66| 亚洲国产精品热久久| 伊人久久久AV老熟妇色| 精品久久人人爽天天玩人人妻| 日韩精品久久无码人妻中文字幕 | 久久夜色精品国产噜噜噜亚洲AV | 蜜臀久久99精品久久久久久小说 | 国内精品久久久久久久久电影网| 麻豆精品久久久久久久99蜜桃| 日韩亚洲欧美久久久www综合网| 99久久国产亚洲综合精品| 久久本道伊人久久| 2021少妇久久久久久久久久| 2021国内久久精品| 久久九九免费高清视频| 丰满少妇人妻久久久久久4| 99久久精品午夜一区二区| 欧美熟妇另类久久久久久不卡| 久久综合色老色| 偷偷做久久久久网站| 久久免费看黄a级毛片| 久久中文字幕人妻熟av女| 久久久久亚洲av综合波多野结衣| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久国产精品99精品国产987| 无码人妻少妇久久中文字幕蜜桃| 伊人情人综合成人久久网小说 | 浪潮AV色综合久久天堂| 亚洲精品蜜桃久久久久久| 国产成人精品久久| 亚洲午夜久久久久久久久电影网 | 国产成人精品久久免费动漫| 97热久久免费频精品99| 99久久精品毛片免费播放|