六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

多線程技術在VC中的應用

[摘要]山東理工大學 賈永新 肖愛梅 Visual C++ 6.0 自發布以來,以其強大的功能及各種新特性受到廣大編程愛好者的青睞。但是要想成為一個優秀的程序員,寫出真正功能強大、能夠快速響應且實用的程序就必須充分利用一項關鍵技術:多線程。筆者在工作中應用這一技術,開發了一個定時關機的實用程序,在此介紹...
山東理工大學 賈永新 肖愛梅

Visual C++ 6.0 自發布以來,以其強大的功能及各種新特性受到廣大編程愛好者的青睞。但是要想成為一個優秀的程序員,寫出真正功能強大、能夠快速響應且實用的程序就必須充分利用一項關鍵技術:多線程。筆者在工作中應用這一技術,開發了一個定時關機的實用程序,在此介紹給廣大讀者,借此幫助讀者加深對這一技術的理解。

程序的功能

此實用程序的主要功能是實現定時關機,同時也提供了輔助功能:隨時關機、重新啟動、注銷以及動態時鐘。如果設置的時間不對,可以隨時更改。這些功能的具體實現采用了多線程技術。

功能的實現

1.線程的定義

本例中單獨設置了一個線程監視當前時間,在Visual C++中線程的簡單調用語句為:AfxBegin

-Thread(ProcName, param, Priority),第一個參數是線程函數名,param是準備傳送給線程的任意32位值,最后一個是線程的優先級(可用常量表示)。這里先定義一個線程函數:

UINT timeThreadProc(LPVOID pParam) //定義線程,必須照此格式

{

CTime gt; //定義時間變量

int hh,mm,ss; //為存儲時間定義整型變量

do //判斷時間的循環

{

gt=CTime::GetCurrentTime();

//提取當前時間

hh=gt.GetHour(); //分別提取時、分、秒 mm=gt.GetMinute();

ss=gt.GetSecond();

} while ((h!=hh) (m!=mm) (s!=ss));

//判斷當前時間

flag=0; //置狀態標志

ExitWindowsEx(EWX_SHUTDOWN,0);

//關閉計算機

return 0;

}

在上面這個函數中,第一行的格式不能改變,其中的h、m、s是三個全局變量,存儲的是設定的時間(時、分、秒)值。通過循環判斷,如果當前時間滿足設定的條件,則調用MFC的函數ExitWindowsEx(UNIT uFlags, DWORD dwReserved)來關閉計算機。

2.線程的調用

線程的調用方式為:CWinThread * pThread=AfxBeginThread(ProcName,param,Priority),其中pThread是指向該線程的指針。源代碼及說明如下:

void CShutDlg::Onqd()

//設置時間后的響應函數

{

UpdateData(TRUE); //從對話框取值

h=m_xsh; //把時、分、秒值傳給全局變量

m=m_fzh;

s=m_miao;

if (flag==1) {pThread->ResumeThread();}

//通過狀態標志判斷,如果線程已經啟動,則恢復運行

else {

pThread=AfxBeginThread(timeThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL); //如果線程沒運行,則啟動線程

flag=1;} //把線程狀態標志位置1

m_chsh.EnableWindow(1);

//重設按鈕可用

m_qd.EnableWindow(0);

//設定按鈕不可用

}

點擊“重設”按鈕的響應函數:

void CShutDlg::Onchsh()

{

if(flag==1) //判斷標志位

{

pThread->SuspendThread();

//如果線程已經啟動,則掛起

}

m_chsh.EnableWindow(0);

//重設按鈕不可用

m_qd.EnableWindow(1); //設定按鈕可用

}

在啟動線程的時候,用*pThread保存線程的指針使得我們可以對線程進行掛起(SuspendThread函數)、恢復(ResumeThread函數)等操作,并通過全局變量h、m、s與線程通信,達到定時關機的目的。

3.動態時鐘線程的實現

為了方便定時,在此程序中加入了一個時鐘。原理主要是通過一個定時器(Timer),定時讀取當前時間并按照格式顯示,這里涉及到了VC中的另一個重要函數:OnTimer(UINT nIDEvent)。在程序啟動初始化的時候,加入語句: m_nTimer=SetTimer(1,100,NULL),其中參數100是響應周期(ms)。通過向導加入時間響應函數,代碼如下:

void CShutDlg::OnTimer(UINT nIDEvent) //定時器響應函數

{

CTime gg; //定義時間變量

CString s;

gg=CTime::GetCurrentTime();

//取出當前時間

s.Format(“%02d”,gg.GetSecond());

//定義輸出格式

SetDlgItemText(IDC_miao1,s);

//在程序中顯示時間

s.Format(“%02d”,gg.GetHour());

SetDlgItemText(IDC_xsh1,s);

s.Format(“%02d”,gg.GetMinute());

SetDlgItemText(IDC_fzh1,s);

CDialog::OnTimer(nIDEvent);

}

OnTimer(UINT nIDEvent)是系統函數,它參考初始化時設置的響應周期(100ms)來執行。需要注意的是,如果在程序中設置了Timer,那么在程序結束的時候要加上語句:KillTimer(0),以銷毀定時器對象,否則白白浪費系統資源。

至此一個較為完整的定時器程序完成(其中重啟、注銷功能的實現很簡單,也非本文的主題,故略過),如果再添加幾個線程,即可擴展為一個多功能備忘錄,有興趣的讀者可以加以改進。

小 結

本文中只是簡單地運用了一個線程,控制方式也是簡單地與全局變量通信的方法,在實際應用中還要注意線程同步、線程之間通信、線程與進程之間通信、利用全局變量通信、利用用戶定義消息通信、利用事件通信等等許多重要問題。只有真正掌握了多線程高級編程技術才能寫出實用、優秀的程序。


主站蜘蛛池模板: 欧美一级黄色片免费看 | 青青草原在线播放 | 日韩黄色一级大片 | 日本黄页网站在线观看 | 天堂网免费 | 欧美综合亚洲图片综合区 | 色综合色综合 | 日韩一级大片 | 午夜小视频男女在线观看 | 中文字幕在线网址 | 亚洲欧美日韩一区高清中文字幕 | 色老头网站久久网 | 午夜视频在线观看一区 | 青青久久久国产线免观 | 欧美欲乱妇135| 又硬又粗又长又爽免费看 | 日韩免费高清一级毛片在线 | 日韩一级一欧美一级国产 | 日本精品高清一区二区2021 | 青春草视频在线观看 | 欧美亚洲国产精品久久久久 | 天天做人人爱夜夜爽2020 | 亚洲成a人一区二区三区 | 日本国产在线观看 | 色综合合久久天天给综看 | 天美传媒在线观看 | 香蕉国产综合久久猫咪 | 手机在线观看mv网址 | 素人天堂| 色噜噜影院 | 欧美午夜精品久久久久免费视 | 日韩欧美一区二区久久黑人 | 四虎永久免费最新在线 | 日日夜夜免费精品视频 | 欧美午夜免费看爽爽爽 | 日本不卡视频一区二区 | 天天干夜夜笙歌 | 欧美一级高清片欧美国产欧美 | 一二三四日本高清 | 欧美综合一区 | 制服丝袜自拍偷拍 |