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

               C++ 技術(shù)中心

               :: 首頁 :: 聯(lián)系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評(píng)論

            評(píng)論排行榜

            一.創(chuàng)建線程函數(shù)
                 常用的創(chuàng)建線程的函數(shù)是CreateThread,還有MFC中的AfxBeginThread方法.另一種函數(shù)是_beginthreadex,
            其實(shí)它在內(nèi)部調(diào)用了CreateThread,在調(diào)用之前_beginthreadex做了很多的工作,從而使得它比CreateThread更
            安全.所以一般使用_beginthreadex來創(chuàng)建線程.于是以下使用_beginthreadex函數(shù)來創(chuàng)建線程類.

            二.線程類示例
            1.Thread.h文件如下:
            #ifndef _THREAD_H__
            #define _THREAD_H__
            #include 
            <process.h>
            #include 
            <windows.h>

            class CThread
            {
            public:
            public:
                CThread();
                
            virtual ~CThread();
                
                BOOL StartThread();   
            //開始線程
                BOOL SuspendThread(); //掛起線程
                virtual BOOL Run();   //線程的入口
                BOOL StopThread();    //等待線程退出再返回
                
                
            static unsigned __stdcall start_address( void * obj);

            public:
                HANDLE m_hthread;        
            //線程句柄
                HANDLE m_hEventSuspend;  //用于標(biāo)識(shí)線程是工作,還是掛起狀態(tài)
                BOOL m_status;           //線程狀態(tài),FALSE表示線程退出狀態(tài),TRUE表示未提出狀態(tài)
                unsigned  m_thrdaddr;
            }
            ;

            #endif/*_THREAD_H__*/


            2.Thread.cpp文件如下:
            #include "Thread.h"


            CThread::CThread()
            {
                m_hEventSuspend 
            = CreateEvent(0,TRUE,FALSE,NULL);//創(chuàng)建事件句柄,且為非激發(fā)狀態(tài)
                m_status 
            = TRUE;

                
            //創(chuàng)建線程
                m_hthread = (HANDLE)_beginthreadex(NULL,0,CThread::start_address,this,0,&m_thrdaddr);
            }


            CThread::
            ~CThread()
            {
                CloseHandle(m_hEventSuspend);
                CloseHandle( m_hthread );
            }


            BOOL CThread::StartThread()
            {
                
            return SetEvent(m_hEventSuspend);
            }


            BOOL CThread::SuspendThread()
            {
                
            return ResetEvent(m_hEventSuspend);
            }


            BOOL CThread::Run()
            {
                
            return TRUE;
            }


            BOOL CThread::StopThread()
            {
                m_status 
            = FALSE;//將線程狀態(tài)置為退出
                StartThread();   //把線程喚醒,以免掛死在休眠處
                WaitForSingleObject(m_hthread,INFINITE); //等待線程退出

                
            return TRUE;
            }


            unsigned __stdcall CThread::start_address( 
            void * obj)
            {
                CThread
            * pthread = static_cast<CThread*>(obj);

                
            while(pthread->m_status)
                
            {
                    WaitForSingleObject(pthread
            ->m_hEventSuspend,INFINITE);//控制掛起,運(yùn)行
                    
            //如果自動(dòng)退出
                    if (!pthread->Run())
                        
            break;
                }

                _endthreadex(
            0);

                
            return 0;
            }



            三.線程類的使用
            1. 新建一個(gè)win32控制臺(tái)工程,代碼如下:
            #include "Thread.h"
            #include 
            <iostream>
            #include 
            <conio.h>


            using namespace std;


            class CMyThread:public CThread
            {
            public:
                BOOL Run()
                
            {
                    cout
            <<"hello!"<<endl;
                    Sleep(
            5000);
                    
            return TRUE;
                }

            }
            ;

            int main(int argc,char *argv[])
            {
                
            //創(chuàng)建線程
                CMyThread mythread;

                
            //讓線程啟動(dòng)
                mythread.StartThread();
                
                
            //按任意鍵,線程掛起
                _getch();
                mythread.SuspendThread();
                cout
            <<"thread suspend"<<endl;

                
            //接任意鍵,線程停止
                _getch();
                mythread.StopThread();
                cout
            <<"thread stop"<<endl;

                
            //按任意鍵,程序退出
                _getch();

                
            return 0;
            }



            posted on 2011-03-11 14:45 C++技術(shù)中心 閱讀(7532) 評(píng)論(7)  編輯 收藏 引用 所屬分類: Windows 編程

            Feedback

            # re: 一個(gè)封裝好的線程類[未登錄] 2011-03-12 10:16 Lucifer
            我覺得你應(yīng)該把static unsigned __stdcall start_address( void * obj);設(shè)置為private的  回復(fù)  更多評(píng)論
              

            # re: 一個(gè)封裝好的線程類 2011-04-24 01:15 dongxu
            如果線程需要傳入?yún)?shù)時(shí)這個(gè)封裝類比較難做到
            可以改進(jìn)一下
              回復(fù)  更多評(píng)論
              

            # re: 一個(gè)封裝好的線程類 2011-04-24 08:24 C++技術(shù)中心
            @dongxu
            你好,該類是封裝好的類。如果自己的類需要擁用線程的特征,可以繼承之。然后覆蓋父類的virtual Run()函數(shù)。在里面實(shí)現(xiàn)你需要的功能。您如果需要傳入任何對(duì)象或指針,可以在你繼承的類中任何新增函數(shù)設(shè)置。  回復(fù)  更多評(píng)論
              

            # re: 一個(gè)封裝好的線程類 2013-09-30 17:57 歲月漫步
            非常之好,收藏了  回復(fù)  更多評(píng)論
              

            # re: 一個(gè)封裝好的線程類 2014-09-02 23:32 abc
            WaitForSingleObject(m_hthread,INFINITE); //等待線程退出

            這里是不是寫錯(cuò)了?不起作用的?
              回復(fù)  更多評(píng)論
              

            # re: 一個(gè)封裝好的線程類 2014-11-06 18:43 freelege
            我覺得你的m_hEventSuspend最好改為m_hEventResume, 否則意思正好相反。  回復(fù)  更多評(píng)論
              

            # re: 一個(gè)封裝好的線程類 2015-08-27 10:21 Mis毛
            使用了static,限制了其只能創(chuàng)建一個(gè)子線程,假若我想創(chuàng)建多個(gè)子線程怎么辦?  回復(fù)  更多評(píng)論
              

            久久精品无码一区二区三区免费| 色综合久久最新中文字幕| 亚洲精品高清久久| 精品蜜臀久久久久99网站| 波多野结衣AV无码久久一区| 色狠狠久久综合网| 久久久久久精品成人免费图片| 久久国产成人亚洲精品影院| 国产视频久久| 99re久久精品国产首页2020| 久久国产精品成人影院| 国产午夜精品久久久久免费视 | 国产精品99久久精品| 久久精品亚洲日本波多野结衣 | 久久精品国产色蜜蜜麻豆| 国产精品嫩草影院久久| 精品久久综合1区2区3区激情| 久久精品国产一区二区| 人妻少妇精品久久| 久久婷婷五月综合成人D啪| 少妇高潮惨叫久久久久久| 2021久久国自产拍精品| 韩国三级大全久久网站| 久久精品国产亚洲Aⅴ香蕉| 伊人久久一区二区三区无码| 久久99久国产麻精品66| 久久99精品久久久久久久不卡| 久久噜噜电影你懂的| 青青热久久国产久精品 | 久久久WWW成人免费精品| 尹人香蕉久久99天天拍| 久久精品无码专区免费东京热| 91久久精品视频| 久久婷婷五月综合色奶水99啪| 精品久久8x国产免费观看| 久久激情亚洲精品无码?V| 久久婷婷五月综合色奶水99啪| 国产精品久久影院| 久久青青草视频| 亚洲国产精品久久久久久| 久久精品国产乱子伦|