• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            Thread Class

            Posted on 2009-02-08 21:29 S.l.e!ep.¢% 閱讀(1962) 評論(7)  編輯 收藏 引用 所屬分類: VC
            上一篇? 代碼有問題,經(jīng)過兩次重構(gòu), 88 line 代碼

            測試代碼::
            ?1
            ?2#include?"thread.h"
            ?3
            ?4class?testThread
            ?5{
            ?6public:
            ?7????testThread()
            ?8????{
            ?9????????m_Obj.setObj(test);
            10????????
            11????}

            12
            13????virtual?~testThread()
            14????{
            15????????m_Obj.stop();
            16????}

            17
            18????static?unsigned?int?test(void*?pVoid)
            19????{
            20????????testThread*?pThis?=?(testThread*)pVoid;
            21
            22????????::EnterCriticalSection(&pThis->m_cs);
            23????????cout?<<?"test"?<<?endl;
            24????????::LeaveCriticalSection(&pThis->m_cs);
            25????????return?0;
            26????}

            27
            28
            29????void?go()
            30????{
            31????????m_Obj.start(this);
            32????}

            33
            34
            35????CThread?m_Obj;
            36????static?CRITICAL_SECTION?m_cs;
            37}
            ;
            38
            39CRITICAL_SECTION?testThread::m_cs;
            40
            41int?main()
            42{????
            43????::InitializeCriticalSection(&testThread.m_cs);
            44
            45????{
            46????????testThread?B[100000];
            47????????
            48????????for(?int?i?=?0;?i?<?100000;?i++?)
            49????????{
            50????????????B[i].go();
            51????????}

            52????}

            53
            54????::DeleteCriticalSection(&testThread.m_cs);
            55
            56????return?0;
            57}


            實(shí)現(xiàn)代碼::
            ?1#include?<windows.h>
            ?2#include?<process.h>
            ?3
            ?4class?CThread
            ?5{
            ?6public:
            ?7????CThread(unsigned?int?(*pfnCall)(void*?pVoid))
            ?8????{
            ?9????????m_pfnCall???=?pfnCall;
            10????????m_hThread???=?INVALID_HANDLE_VALUE;
            11????????m_nThreadID?=?0;
            12????????m_pObj??????=?NULL;
            13????}

            14
            15????virtual?~CThread()
            16????{
            17????????stop();
            18????}

            19
            20????static?unsigned?__stdcall?_ThreadProc(void*?pVoid)
            21????{
            22????????CThread*?pThis?=?(CThread*)pVoid;
            23
            24????????if?(?NULL?!=?pThis->m_pfnCall?)
            25????????????pThis->m_pfnCall(pThis->m_pObj);
            26
            27?????????_endthread();
            28
            29????????return?0;
            30????}

            31
            32????bool?start(void*?pVoid)
            33????{
            34????????m_pObj?=?pVoid;
            35????????m_hThread?=?(HANDLE)_beginthreadex(NULL,?0,?_ThreadProc,?(void?*)this,?0,?&m_nThreadID);
            36????????
            37????????if?(?0?==?m_hThread?)
            38????????????return?false;
            39????????else
            40????????????return?true;
            41????}

            42
            43????bool?stop()
            44????{
            45????????#define?ONE_SECOND?1000L
            46
            47????????if?(?INVALID_HANDLE_VALUE?==?m_hThread?)
            48????????????return?true;
            49
            50????????BOOL?bRet???=?FALSE;
            51????????DWORD?dwRet?=?0;
            52
            53????????DWORD?dwExitCode?=?0;
            54????????if(?TRUE?==?::GetExitCodeThread(m_hThread,?&dwExitCode)?)
            55????????{
            56????????????if(?STILL_ACTIVE?==?dwExitCode?)????????????
            57????????????????dwRet?=?::WaitForSingleObject(m_hThread,?ONE_SECOND);?//?INFINITE
            58????????}

            59????????????????
            60????????if?(?dwRet?==?WAIT_TIMEOUT?||?dwRet?==?WAIT_FAILED?)?
            61????????{
            62????????????bRet?=?::TerminateThread(m_hThread,?1);
            63????????}

            64????????else
            65????????{
            66????????????bRet?=?TRUE;
            67????????}

            68????????
            69????????if?(?TRUE?==?bRet?)
            70????????{
            71????????????return?true;
            72????????}

            73????????else
            74????????{
            75????????????return?false;
            76????????}

            77????}
            ????
            78
            79private:
            80????CThread()
            81????{
            82????}

            83
            84????HANDLE???????m_hThread;
            85????unsigned?int?m_nThreadID;
            86????unsigned?int?(*m_pfnCall)(void*?pVoid);
            87????void*????????m_pObj;
            88}
            ;

            Feedback

            # re: 查了MSDN,發(fā)現(xiàn)之前寫的類有問題  回復(fù)  更多評論   

            2009-02-08 13:58 by IT公司面試手冊
            還沒寫完吧
            怎么文不對題呢

            # re: Thread Class  回復(fù)  更多評論   

            2009-02-08 17:27 by lwan
            void setObj(unsigned int (*pfnCall)(void* pVoid))
            建議放在構(gòu)造函數(shù)里面,因?yàn)闆]有這個回調(diào)這個線程就是一個dummy線程。

            # re: Thread Class[未登錄]  回復(fù)  更多評論   

            2009-02-08 22:17 by 關(guān)中刀客
            說真的,這個封裝的很不好

            # re: Thread Class  回復(fù)  更多評論   

            2009-02-08 22:24 by 放屁阿狗
            的確不好

            # re: Thread Class  回復(fù)  更多評論   

            2009-02-08 22:53 by Dancefire
            封裝這個作甚?是自己玩么?如果真用起來,還是建議你考慮一下很多已經(jīng)作好的封裝。許多出色的線程庫都充分利用了C++特性,并且是跨平臺的,比這個要好的多。比如,

            [boost::thread]

            http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
            http://www.stlchina.org/twiki/bin/view.pl/Main/BoostThread

            如果需要小巧,也有ting,也是跨平臺的:
            [ting]
            http://code.google.com/p/ting/

            也有含在glibmm里面的Glib::Thread
            [glibmm/threads]
            http://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/group__Threads.html

            如果不是coding 4 fun,而是有任何使用價(jià)值,不妨停止重復(fù)造輪子,看看已有實(shí)現(xiàn)先。畢竟那些充分利用了C++特性,而且是跨平臺的。另外需要注意的是,C++并不追求代碼行數(shù)最少,而是追求效率和結(jié)構(gòu),不要陷入用最短的代碼就是最好的誤區(qū)。

            # re: Thread Class  回復(fù)  更多評論   

            2009-02-09 13:26 by 路人
            重新發(fā)明輪子,看看這個實(shí)現(xiàn)。
            http://www.viksoe.dk/code/thread.htm

            # re: Thread Class  回復(fù)  更多評論   

            2009-02-09 15:24 by true
            @Dancefire
            從你的本貼中的回復(fù),以及以前對我的一個帖子的回復(fù)看,兄弟知識面比較廣,全面,值得學(xué)習(xí)。不知道你從事什么工作,支持使用各種庫,反正我工作過的幾個公司,都是從頭開始開發(fā),除非是壓縮等算法相關(guān)性強(qiáng)的領(lǐng)域,才會考慮使用開源的庫。
            久久久久久国产a免费观看黄色大片| 久久亚洲sm情趣捆绑调教| 一本久久免费视频| 麻豆成人久久精品二区三区免费 | 亚洲国产精品18久久久久久| 日本福利片国产午夜久久| 精品国产乱码久久久久久呢| 精品国产91久久久久久久a | 久久精品国产亚洲欧美| 模特私拍国产精品久久| 国产精品99久久久久久www| 久久人人爽爽爽人久久久| 久久天天躁狠狠躁夜夜avapp| 久久久无码精品亚洲日韩软件| 久久精品www人人爽人人| 久久久久亚洲精品日久生情 | 久久精品国产WWW456C0M| 国产成人久久精品激情| 精品无码久久久久国产动漫3d| 亚洲精品无码久久不卡| 国产亚洲精午夜久久久久久| 国产精品久久久久AV福利动漫| 精品熟女少妇AV免费久久 | 日韩av无码久久精品免费| 久久久久免费精品国产| 18禁黄久久久AAA片| 亚洲伊人久久成综合人影院| 久久久这里有精品中文字幕| 国产午夜精品久久久久九九| 一本久久久久久久| 日韩精品国产自在久久现线拍 | 2020最新久久久视精品爱| 久久综合九色综合97_久久久| 久久精品国产亚洲77777| 久久99国产综合精品女同| 久久精品国产亚洲av影院| 久久国产亚洲高清观看| 精品无码久久久久国产| 996久久国产精品线观看| 人人狠狠综合久久亚洲88| 国产精品丝袜久久久久久不卡|