• <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.¢%

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

            Thread Class

            Posted on 2009-02-08 21:29 S.l.e!ep.¢% 閱讀(1962) 評論(7)  編輯 收藏 引用 所屬分類: VC
            上一篇? 代碼有問題,經過兩次重構, 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}


            實現代碼::
            ?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,發現之前寫的類有問題  回復  更多評論   

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

            # re: Thread Class  回復  更多評論   

            2009-02-08 17:27 by lwan
            void setObj(unsigned int (*pfnCall)(void* pVoid))
            建議放在構造函數里面,因為沒有這個回調這個線程就是一個dummy線程。

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

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

            # re: Thread Class  回復  更多評論   

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

            # re: Thread Class  回復  更多評論   

            2009-02-08 22:53 by Dancefire
            封裝這個作甚?是自己玩么?如果真用起來,還是建議你考慮一下很多已經作好的封裝。許多出色的線程庫都充分利用了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,而是有任何使用價值,不妨停止重復造輪子,看看已有實現先。畢竟那些充分利用了C++特性,而且是跨平臺的。另外需要注意的是,C++并不追求代碼行數最少,而是追求效率和結構,不要陷入用最短的代碼就是最好的誤區。

            # re: Thread Class  回復  更多評論   

            2009-02-09 13:26 by 路人
            重新發明輪子,看看這個實現。
            http://www.viksoe.dk/code/thread.htm

            # re: Thread Class  回復  更多評論   

            2009-02-09 15:24 by true
            @Dancefire
            從你的本貼中的回復,以及以前對我的一個帖子的回復看,兄弟知識面比較廣,全面,值得學習。不知道你從事什么工作,支持使用各種庫,反正我工作過的幾個公司,都是從頭開始開發,除非是壓縮等算法相關性強的領域,才會考慮使用開源的庫。
            99久久精品国产一区二区三区| 久久久久99这里有精品10| 亚洲综合伊人久久综合| 久久99久久99精品免视看动漫| 久久电影网2021| 色综合合久久天天给综看| 2021久久国自产拍精品| 欧美精品丝袜久久久中文字幕| 97久久香蕉国产线看观看| 久久综合色区| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 97久久天天综合色天天综合色hd| 国产精品99久久不卡| 狠狠88综合久久久久综合网| 欧洲国产伦久久久久久久| 国产精品久久午夜夜伦鲁鲁| 久久国产综合精品五月天| 久久久久亚洲AV无码麻豆| 亚洲国产综合久久天堂| 久久99精品久久久久久噜噜| av午夜福利一片免费看久久| 狠狠色丁香久久婷婷综合_中| 久久精品国产一区二区三区不卡| 国产成人精品久久一区二区三区| 久久人妻AV中文字幕| 伊人色综合久久天天网| 久久人人爽人人精品视频| 久久av高潮av无码av喷吹| 四虎国产永久免费久久| 国产午夜精品理论片久久影视| 亚洲AV无码1区2区久久| 新狼窝色AV性久久久久久| 亚洲va久久久噜噜噜久久狠狠| 亚洲日韩中文无码久久| 三上悠亚久久精品| 久久久国产乱子伦精品作者| 欧洲成人午夜精品无码区久久| 久久丫精品国产亚洲av不卡| 久久久久亚洲AV无码网站| 97久久精品国产精品青草| 久久99国产精品二区不卡|