《深入浅出MFC》笔记(四)

本文通过示例代码介绍了如何设置不同线程的优先级,并演示了C++运行时类型识别(RTTI)的使用方法。通过创建不同优先级的线程并展示它们的行为差异,以及通过RTTI来确定对象类型并据此调用适当的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

None.gif #define HIGHEST_THREAD0x00
None.gif
#define ABOVE_AVE_THREAD0x3F
None.gif
#define NORMAL_THREAD0x7F
None.gif
#define BELOW_AVE_THREAD0xBF
None.gif
#define LOWEST_THREAD0xFF
None.gif
#define SLEEPDELAY1
None.gif
#define FORLOOPDELAY2
None.gif
#define NODELAY3
None.gif
None.gifHWNDhWnd;
None.gifHANDLE_hThread[
5 ];
None.gifUINT_uDelayType
= NODELAY; // 类型
None.gif

None.gifLRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
intwmId,wmEvent;
InBlock.gifPAINTSTRUCTps;
InBlock.gifHDChdc;
InBlock.gif
inti;
InBlock.gifDWORDThreadID[
5];
InBlock.gif
staticHMENUhMenu;
InBlock.gif
staticHANDLEhMasterThread;
ExpandedSubBlockStart.gifContractedSubBlock.gif
staticDWORDThreadArg[5]=dot.gif{HIGHEST_THREAD,//0x00
InBlock.gif
ABOVE_AVE_THREAD,//0x3F
InBlock.gif
NORMAL_THREAD,//0x7F
InBlock.gif
BELOW_AVE_THREAD,//0xBF
InBlock.gif
LOWEST_THREAD//0xFF
ExpandedSubBlockEnd.gif
}
;
InBlock.gif
switch(message)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
caseWM_CREATE:
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifhMenu
=GetMenu(hWnd);
InBlock.gifhMasterThread
=GetCurrentThread();
InBlock.gifSetThreadPriority(hMasterThread,THREAD_PRIORITY_HIGHEST);
InBlock.gif
for(i=0;i<5;i++)
InBlock.gif_hThread[i]
=CreateThread(NULL,
InBlock.gif
0,
InBlock.gif(LPTHREAD_START_ROUTINE)ThreadProc,
InBlock.gif
&ThreadArg[i],
InBlock.gifCREATE_SUSPENDED,
InBlock.gif
&ThreadID[i]);
InBlock.gifSetThreadPriority(_hThread[
0],THREAD_PRIORITY_HIGHEST);
InBlock.gifSetThreadPriority(_hThread[
1],THREAD_PRIORITY_ABOVE_NORMAL);
InBlock.gifSetThreadPriority(_hThread[
2],THREAD_PRIORITY_NORMAL);
InBlock.gifSetThreadPriority(_hThread[
3],THREAD_PRIORITY_BELOW_NORMAL);
InBlock.gifSetThreadPriority(_hThread[
4],THREAD_PRIORITY_LOWEST);
ExpandedSubBlockEnd.gif}

InBlock.gif
break;
InBlock.gif
caseWM_COMMAND:
InBlock.gifwmId
=LOWORD(wParam);
InBlock.gifwmEvent
=HIWORD(wParam);
InBlock.gif
//Parsethemenuselections:
InBlock.gif
switch(wmId)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
caseIDM_ABOUT:
InBlock.gifDialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);
InBlock.gif
break;
InBlock.gif
caseIDM_EXIT:
InBlock.gifDestroyWindow(hWnd);
InBlock.gif
break;
InBlock.gif
caseIDM_RESUME:
InBlock.gifEnableMenuItem(hMenu,IDM_RESUME,MF_BYCOMMAND
|MF_GRAYED);
InBlock.gifEnableMenuItem(hMenu,IDM_SUSPEND,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifDrawMenuBar(hWnd);
InBlock.gif
for(i=0;i<5;i++)
InBlock.gifResumeThread(_hThread[i]);
InBlock.gif
return(0);
InBlock.gif
caseIDM_SUSPEND:
InBlock.gif
for(i=0;i<5;i++)
InBlock.gifSuspendThread(_hThread[i]);
InBlock.gifEnableMenuItem(hMenu,IDM_SUSPEND,MF_BYCOMMAND
|MF_GRAYED);
InBlock.gifEnableMenuItem(hMenu,IDM_RESUME,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifDrawMenuBar(hWnd);
InBlock.gif
return(0);
InBlock.gif
caseIDM_FORLOOP:
InBlock.gif_uDelayType
=FORLOOPDELAY;
InBlock.gifEnableMenuItem(hMenu,IDM_FORLOOP,MF_BYCOMMAND
|MF_GRAYED);
InBlock.gifEnableMenuItem(hMenu,IDM_SLEEP,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifEnableMenuItem(hMenu,IDM_NODELAY,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifDrawMenuBar(hWnd);
InBlock.gif
return(0);
InBlock.gif
caseIDM_SLEEP:
InBlock.gif_uDelayType
=SLEEPDELAY;
InBlock.gifEnableMenuItem(hMenu,IDM_SLEEP,MF_BYCOMMAND
|MF_GRAYED);
InBlock.gifEnableMenuItem(hMenu,IDM_FORLOOP,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifEnableMenuItem(hMenu,IDM_NODELAY,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifDrawMenuBar(hWnd);
InBlock.gif
return(0);
InBlock.gif
caseIDM_NODELAY:
InBlock.gif_uDelayType
=NODELAY;
InBlock.gifEnableMenuItem(hMenu,IDM_NODELAY,MF_BYCOMMAND
|MF_GRAYED);
InBlock.gifEnableMenuItem(hMenu,IDM_FORLOOP,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifEnableMenuItem(hMenu,IDM_SLEEP,MF_BYCOMMAND
|MF_ENABLED);
InBlock.gifDrawMenuBar(hWnd);
InBlock.gif
return(0);
InBlock.gif
default:
InBlock.gif
returnDefWindowProc(hWnd,message,wParam,lParam);
ExpandedSubBlockEnd.gif}

InBlock.gif
break;
InBlock.gif
caseWM_PAINT:
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifhdc
=BeginPaint(hWnd,&ps);
InBlock.gifEndPaint(hWnd,
&ps);
ExpandedSubBlockEnd.gif}

InBlock.gif
break;
InBlock.gif
caseWM_DESTROY:
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(i=0;i<5;i++)
InBlock.gifTerminateThread(_hThread[i],
0);
InBlock.gifPostQuitMessage(
0);
ExpandedSubBlockEnd.gif}

InBlock.gif
break;
InBlock.gif
default:
InBlock.gif
returnDefWindowProc(hWnd,message,wParam,lParam);
ExpandedSubBlockEnd.gif}

InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
None.gifVOIDThreadProc(DWORD
* ThreadArg)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifRECTrect;
InBlock.gifHDChDC;
InBlock.gifHANDLEhBrush,hOldBrush;
InBlock.gifDWORDdwThreadHits
=0;
InBlock.gif
charcBuf[80];
InBlock.gif
intiThreadNo,i;
InBlock.gifGetClientRect(hWnd,
&rect);
InBlock.gifhDC
=GetDC(hWnd);
InBlock.gifhBrush
=CreateSolidBrush(RGB(*(ThreadArg),*(ThreadArg),*(ThreadArg)));//跑て礶肅︹
InBlock.gif
hOldBrush=SelectObject(hDC,hBrush);
ExpandedSubBlockStart.gifContractedSubBlock.gif
switch(*ThreadArg)dot.gif{
InBlock.gif
caseHIGHEST_THREAD:iThreadNo=0;break;
InBlock.gif
caseABOVE_AVE_THREAD:iThreadNo=1;break;
InBlock.gif
caseNORMAL_THREAD:iThreadNo=2;break;
InBlock.gif
caseBELOW_AVE_THREAD:iThreadNo=3;break;
InBlock.gif
caseLOWEST_THREAD:iThreadNo=4;break;
ExpandedSubBlockEnd.gif}

InBlock.gifsprintf(cBuf,
"T%d",iThreadNo);
InBlock.gifTextOut(hDC,
*(ThreadArg),rect.bottom-150,(LPCWSTR)(LPCSTR)cBuf,strlen(cBuf));
InBlock.gifsprintf(cBuf,
"P=%d",GetThreadPriority(_hThread[iThreadNo]));
InBlock.gifTextOut(hDC,
*(ThreadArg),rect.bottom-130,(LPCWSTR)(LPCSTR)cBuf,strlen(cBuf));
InBlock.gif
do
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifdwThreadHits
++;
InBlock.gifRectangle(hDC,
*(ThreadArg),rect.bottom-(dwThreadHits/10),
InBlock.gif
*(ThreadArg)+0x40,rect.bottom);
InBlock.gif
if(_uDelayType==SLEEPDELAY)
InBlock.gifSleep(
10);
InBlock.gif
elseif(_uDelayType==FORLOOPDELAY)
InBlock.gif
for(i=0;i<30000;i++);
InBlock.gif
else//_uDelayType==NODELAY)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{}
ExpandedSubBlockEnd.gif}
while(dwThreadHits<1000);
InBlock.gifhBrush
=SelectObject(hDC,hOldBrush);
InBlock.gifDeleteObject(hBrush);
InBlock.gifReleaseDC(hWnd,hDC);
ExpandedBlockEnd.gif}

None.gif

2C++中的RTTI

None.gif #include < typeinfo.h >
None.gif#include
< iostream >
None.gif
using namespace std;
None.gif#include
< string .h >
None.gif
None.gif
class graphicImage
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
protected:
InBlock.gif
charname[80];
InBlock.gif
public:
InBlock.gifgraphicImage()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstrcpy(name,
"graphicImage");
ExpandedSubBlockEnd.gif}

InBlock.gif
virtualvoiddisplay()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<"Displayagenericimage."<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gif
char*getName()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
returnname;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}
;
None.gif
// ----------------------------------------------------------------
None.gif
class GIFimage: public graphicImage
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
public:
InBlock.gifGIFimage()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstrcpy(name,
"GIFimage");
ExpandedSubBlockEnd.gif}

InBlock.gif
voiddisplay()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<"DisplayaGIFfile."<<endl;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}
;
None.gif
class PICTimage: public graphicImage
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
public:
InBlock.gifPICTimage()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstrcpy(name,
"PICTimage");
ExpandedSubBlockEnd.gif}

InBlock.gif
voiddisplay()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifcout
<<"DisplayaPICTfile."<<endl;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}
;
None.gif
// ----------------------------------------------------------------
None.gif
void processFile(graphicImage * type)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
if(typeid(GIFimage)==typeid(*type))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif((GIFimage
*)type)->display();
ExpandedSubBlockEnd.gif}

InBlock.gif
elseif(typeid(PICTimage)==typeid(*type))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif((PICTimage
*)type)->display();
ExpandedSubBlockEnd.gif}

InBlock.gif
else
InBlock.gifcout
<<"Unknowntype!"<<(typeid(*type)).name()<<endl;
ExpandedBlockEnd.gif}

None.gif
void main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifgraphicImage
*gImage=newGIFimage();
InBlock.gifgraphicImage
*pImage=newPICTimage();
InBlock.gifprocessFile(gImage);
InBlock.gifprocessFile(pImage);
ExpandedBlockEnd.gif}

None.gif

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值