• <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),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(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)闆]有這個(gè)回調(diào)這個(gè)線程就是一個(gè)dummy線程。

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

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

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

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

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

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

            [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ā)明輪子,看看這個(gè)實(shí)現(xiàn)。
            http://www.viksoe.dk/code/thread.htm

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

            2009-02-09 15:24 by true
            @Dancefire
            從你的本貼中的回復(fù),以及以前對我的一個(gè)帖子的回復(fù)看,兄弟知識面比較廣,全面,值得學(xué)習(xí)。不知道你從事什么工作,支持使用各種庫,反正我工作過的幾個(gè)公司,都是從頭開始開發(fā),除非是壓縮等算法相關(guān)性強(qiáng)的領(lǐng)域,才會考慮使用開源的庫。
            久久婷婷五月综合97色| 久久久青草久久久青草| 精品国产91久久久久久久| 久久免费观看视频| 99久久久精品免费观看国产| 午夜精品久久久久久| 久久亚洲精品视频| 嫩草伊人久久精品少妇AV| 久久最新免费视频| 国产三级观看久久| 狠狠综合久久综合88亚洲| 色婷婷狠狠久久综合五月| 51久久夜色精品国产| 久久久久人妻一区精品色| 99精品国产99久久久久久97 | 99精品国产在热久久| 亚洲国产成人久久综合区| 国内精品久久久久久久久电影网| 久久久久久久久久久久中文字幕 | 久久精品综合网| 久久久久亚洲AV成人网人人软件 | 精品久久久久久无码中文字幕一区 | 国产精品内射久久久久欢欢| 精品久久久久久久无码| 无码精品久久久天天影视| 久久久噜噜噜久久中文字幕色伊伊 | 久久久久亚洲AV无码专区桃色| 91精品国产色综久久| 日本道色综合久久影院| 久久综合久久综合久久| 久久99毛片免费观看不卡| 999久久久免费精品国产| 国产成人精品白浆久久69| 国产高潮国产高潮久久久| 97精品久久天干天天天按摩| 精品久久久久久无码中文字幕一区| 久久精品无码午夜福利理论片| 精品无码久久久久久尤物| 国内精品伊人久久久久| 99精品久久久久久久婷婷| 久久亚洲国产精品五月天婷|