ebook51-14

Similar documents
Microsoft Word - CIN-DLL.doc

FY.DOC

Microsoft Word - 11.doc

ebook140-8

提问袁小兵:

Microsoft Word - 01.DOC

epub 61-2

附录J:Eclipse教程

Factory Methods

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

LSC操作说明

ebook45-5

全国计算机技术与软件专业技术资格(水平)考试

科学计算的语言-FORTRAN95

Microsoft Word - 3D手册2.doc

Microsoft PowerPoint - seminar-10-ch19-iterator.ppt

全国计算机技术与软件专业技术资格(水平)考试

EK-STM32F

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

國 立 政 治 大 學 教 育 學 系 2016 新 生 入 學 手 冊 目 錄 表 11 國 立 政 治 大 學 教 育 學 系 博 士 班 資 格 考 試 抵 免 申 請 表 論 文 題 目 申 報 暨 指 導 教 授 表 12 國 立 政 治 大 學 碩 博 士 班 論

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

zw.PDF

Microsoft Word - Datastream5.1_使用說明201110

Lorem ipsum dolor sit amet, consectetuer adipiscing elit

_汪_文前新ok[3.1].doc

尽 管 Java 语 言 是 在 C++ 语 言 基 础 上 发 展 起 来 的, 但 与 C++ 不 同,Java 是 一 种 纯 粹 的 面 向 对 象 语 言 (Object-oriented language) 在 Java 世 界 中, 所 有 事 物 都 是 Object 1. 通 过

nooog

Microsoft Word - A doc

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

Microsoft Word - Front cover_white.doc

摘 要 本 校 多 媒 體 設 計 系 與 上 海 戲 劇 學 院 創 意 學 院 在 多 次 聯 繫 交 流 之 下, 已 簽 署 合 作 備 忘 錄, 積 極 尋 求 兩 校 合 作 教 學 與 共 同 創 作 之 機 會 藉 由 本 系 學 生 作 品 腦 殘 公 寓 入 圍 第 五 屆 中

PL600 IPPBX 用户手册_V2.0_.doc

软件测试(TA07)第一学期考试

Java

Microsoft Word - (web)_F.1_Notes_&_Application_Form(Chi)(non-SPCCPS)_16-17.doc

ch_code_infoaccess

Microsoft PowerPoint - os_4.ppt

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南

Microsoft Word - 小心翼翼的二十一點N.doc

從詩歌的鑒賞談生命價值的建構

SDS 1.3

3. 給 定 一 整 數 陣 列 a[0] a[1] a[99] 且 a[k]=3k+1, 以 value=100 呼 叫 以 下 兩 函 式, 假 設 函 式 f1 及 f2 之 while 迴 圈 主 體 分 別 執 行 n1 與 n2 次 (i.e, 計 算 if 敘 述 執 行 次 數, 不

目 录 目 录 1. 安 装 和 快 速 入 门 附 件 1.1 随 机 附 件 附 件 信 息... 3 连 接 和 设 定 1.3 连 接 记 录 纸... 4 快 速 入 门 1.5 发 送 传 真 / 复 印 接 收 传 真

ebook10-5

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

星河33期.FIT)

第壹拾篇

好文章 吳麗娟老師收集 85頁

User’s Manual

(procedure-oriented)?? 2

第一章 概论

<4D F736F F D20B3CCD0F2D4B12DCFC2CEE7CCE2A3AD3037C9CF>

(Guangzhou) AIT Co, Ltd V 110V [ ]! 2

尽 管 Java 语 言 是 在 C++ 语 言 基 础 上 发 展 起 来 的, 但 是 有 别 于 C++,Java 是 一 种 纯 粹 的 面 向 对 象 语 言 (Object-oriented language) 在 像 Java 这 样 纯 粹 的 面 向 对 象 语 言 中, 所 有

an153f

Chapter 1 What is Programing Paradigm 1

Microsoft Word - InoTouch Editor编程软件手册 doc

游戏厅捕鱼技巧_天天酷跑游戏技巧 2048游戏技巧,游戏厅打鱼技巧_

北 京 奧 運 會 上 倒 舉 中 共 國 旗 的 小 男 孩

Untitiled

目 錄 壹 青 輔 會 結 案 附 件 貳 活 動 計 劃 書 參 執 行 內 容 一 教 學 內 容 二 與 當 地 教 師 教 學 交 流 三 服 務 執 行 進 度 肆 執 行 成 效 一 教 學 課 程 二 與 當 地 教 師 教 學 交 流 三 服 務 滿 意 度 調 查 伍 服 務 檢

Microsoft Word - #3 Emergencies-revised.doc

WFC40810

运动员治疗用药豁免申报审批办法

自动化接口

Microsoft PowerPoint - Compiler-7 - Runtime Environment.ppt [兼容模式]

Microsoft Word - chap13.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

UTI (Urinary Tract Infection) - Traditional Chinese

Microsoft Word - VL880manual-v88313-tc3.doc

1505.indd

epub 75-1

f2.eps

PowerPoint 演示文稿

GoFlex Home UG Book.book

epub 61-6

1 Internet [1]P Web Service Web Service Web XML HTTP URL 1..NET Framework.NET Framework Web Service HTTP 80.NET Framework 2

ebook37-11

《大话设计模式》第一章

Microsoft PowerPoint - OPVB1基本VB.ppt

chp6.ppt

WVT new

Learn_Perl 3-02.pdf

Microsoft Word - chap10.doc

自 己 的 网 格 里 将 该 词 划 去 6. 当 一 名 学 生 发 现 划 去 的 单 词 ( 至 少 三 个 ) 在 横 线 竖 线 或 者 对 角 线 上 能 排 成 一 条 直 线 时, 学 生 大 声 喊 出 Bingo! 老 师 请 该 学 生 朗 读 出 排 成 直 线 的 单 词

Strings

Transcription:

14 Wi n d o w s M F C 53 54 55 56 ( ) ( Wo r k e r T h r e a d ) 57 ( ) ( U s e r Interface Thread) 58 59 14.1 53 1. 2. C l a s s Wi z a r d O n I d l e () 3. Class Wi z a r d O n I d l e () O n I d l e () BOOL CWzdApp::OnIdle( LONG lcount ) // clean up temporary objects while (!m_templist.isempty() )

332 delete m_te m p L i s t. R e m o v e H e a d ( ) ; return CWinApp::OnIdle( lcount ); 4. O n I d l e () C Wi n A p p :: O n I d l e (), ( s h e l l ) O n I d l e () O n I d l e ( 5. W z d. c p p O n I d l e () ( ) W z d Te s t O n I d l e () 14.2 54 1. 2. M F C M F C Wi n d o w s A P I :: WinExec () A P I :: Wi n E x e c () A P I ::CreateProcess () 3. 1) :: WinExec () :: WinExec () W z d. b a t CString str; str = "Wzd.bat"; // execute a batch file if ( ::Wi n E x e c ( e l s e s t r, SW_NORMAL ) // command line // see ShowWindow for other options >31 ) // numbers lower then 31 are failures AfxMessageBox( "Successfully created." ); AfxMessageBox( "Failed to create process." ); 2) :: C r e a t e P r o c e s s ()

14 333 CString str; S TA RTUPINFO si; P R O C E S S _ I N F O R M ATION pi; // specify command str = "Wzd.bat"; // zero out and initialize STA RT U P I N F O memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si ); si.dwflags = STA RT F _ U S E S H O W W I N D O W; s i. w S h o w Window = SW_SHOW; if ( CreateProcess( N U L L, // can be name of process unless // batch file, else must be // in command line: ( char * )LPCSTR( str ), // command line N U L L, N U L L, FA L S E, N O R M A L _ P R I O R I T Y _ C L A S S, N U L L, N U L L, & s i, & p i ) ) AfxMessageBox( "Successfully created." ); HANDLE ph = pi.hprocess; // wait until application is ready for input if (!WaitForInputIdle( ph,1000 ) ) e l s e // send messages, etc. // kill process with 0 exit code TerminateProcess( ph, 0 ); AfxMessageBox( "Failed to create process." ); 3) // security options // if true will inherit all // inheritable handles // from this process // can also be HIGH_PRIORITY_CLASS // or IDLE_PRIORITY_CLASS // inherit this process's // environment block // specifies working directory // of created process // STA RTUPINFO specified above // PROCESS_INFORMATION returned Windows API :: G e t M o d u l e F i l e N a m e ()

334 // change directory to this application's.exe file char szbuff e r [ 1 2 8 ] ; ::GetModuleFileName( AfxGetInstanceHandle(), szbuff e r, sizeof( szbuffer ) ); char *p = strrchr( szbuff e r, '\\' ); *p = 0; S Z B u ff e r _ c h d i r ( s z B u ff e r ) ; 4. Wi n E x e c () S h o w Wi n d o w () S W _ H I D E, SW_MAXMIZE, SW_MINIMIZE A P I \ C:\Program Files\Microsoft Off i c e \ p r o g. e x e "C:\Program Files\Microsoft Off i c e \ p r o g. e x e " C M D. E X E :: C r e a t e P r o c e s s () Te r m i n a t e P r o c e s s () M F C ( 58 ) Te r m i n a t e P r o c e s s () Wi n d o w s 57 49 50 5. M a i n f r m. c p p O n W z d 1 Te s t () O n W z d 2 Te s t () Te s t W z d 1 W z d 2 w z d. b a t 14.3 55 1.

14 335 2. ::SetPriority() API :: S e t T h r e a d P r i o r i t y () API 3. 1) ::SetPriorityClass( : : G e t C u r r e n t P r o c e s s ( ), // process handle // REALT I M E _ P R I O R I T Y _ C L A S S // highest: thread must run // immediately before any // other system task // HIGH_PRIORITY_CLASS // high: time-critical threads // NORMAL_PRIORITY_CLASS // normal: thread with equal I D L E _ P R I O R I T Y _ C L A S S ) ; DWORD priority = : : G e t P r i o r i t y C l a s s ( // importance to other // system applications // low: threads that can run in // the background of the // entire system : : G e t C u r r e n t P r o c e s s ( ) // process handle ) ; 2) S e t T h r e a d P r i o r i t y ( T H R E A D _ P R I O R I T Y _ T I M E _ C R I T I C A L T H R E A D _ P R I O R I T Y _ H I G H E S T T H R E A D _ P R I O R I T Y _ A B O V E _ N O R M A L T H R E A D _ P R I O R I T Y _ N O R M A L T H R E A D _ P R I O R I T Y _ B E L O W _ N O R M A L T H R E A D _ P R I O R I T Y _ L O W E S T T H R E A D _ P R I O R I T Y _ I D L E ) ; 4. // highest priority // next highest // etc... // lowest priority C P U C P U C P U 5. W z d. c p p S e t P r i o r i t y C l a s s () F i l e / O p e n

336 Windows Explorer 14.4 56 1. C P U 2. A f x B e g i n T h r e a d () Wi n d o w s 3. 1) typedef struct t_threaddata HWND hdonewnd; int ndata; THREADDATA ; // window handle of main app to send messages // data to process p P a r a m UINT WzdThread( LPVOID pparam ) // get data from thread creator T H R E A D D ATA *pdata = ( THREADDATA * )pparam; // do calulations for ( int i = pdata -> ndata;i < 1000000;i++ ) // save data back to thread creator pdata -> ndata = i; // tell creator we re done ::SendMessage( pdata -> hdonewnd, WM_DONE, 0, 0 ); return 0; G e t E x i t T h r e a d () A f x E n d T h r e a d ( a rg ) a rg 2) A f x B e g i n T h r e a d () T H R E A D D ATA m_threaddata;

14 337 : : : ThreadData.nData = 123; ThreadData.hDoneWnd = m_hwnd; A f x B e g i n T h r e a d ( W z d T h r e a d, & m _ T h r e a d D a t a ) ; // static thread process declare // data to send to thread 3) Wi n d o w s #define WM_DONE WM_USER + 1 // tell creator we re done ::SendMessage( pdata -> hdonewnd, WM_DONE, 0, 0 ); O N _ M E S S A G E _ V O I D () C l a s s Wi z a r d BEGIN_MESSAGE_MAP( CWzdVi e w, CView ) // AFX_MSG_MAP( CWzdView ) // AFX_MSG_MAP ON_MESSAGE_VOID( WM_DONE,OnDone ) E N D _ M E S S A G E _ M A P ( ) void CWzdVi e w : : O n D o n e ( ). h ON_MESSAGE_VOID() O N _ M E S S A G E ( ) 4. C W n d C W n d C W n d C W n d 59 A f x B e g i n T h r e a d () C Wi n T h r e a d A f x E n d T h r e a d () ::PostQuitMessage () 51 5 2 all done O N _

338 MESSAGE () L R E S U LT CMainFrame::OnDone( WPARAM wparam,lparam lparam ) return 0; 5. W z d v i e w. c p p O n Te s t W z d () O n D o n e () Te s t W z d #ifndef WZDTHREAD_H #define WZDTHREAD_H #define WM_DONE WM_USER + 1 typedef struct t_threaddata HWND hdonewnd; int ndata; THREADDATA ; UINT WzdThread( LPVOID pparam ); # e n d i f // WzdThread.cpp : thread process / / #include "stdafx.h" #include "WzdThread.h" / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // CWzdThread UINT WzdThread( LPVOID pparam ) // get data from thread creator T H R E A D D ATA *pdata = ( THREADDATA * )pparam; // do calulations for ( int i = pdata -> ndata;i < 1000000;i++ ) // save data back to thread creator pdata -> ndata = i; // tell creator we re done ::SendMessage( pdata -> hdonewnd, WM_DONE, 0, 0 ); return 0; // return value up to you parent can retrieve with GetExitCodeThread(); // can also call AfxEndThread(0) where the meaning of the argument is up to you

14 339 14.5 57 1. 2. AfxBegin Thread () 56 C Wi n T h r e a d 3. 1) C l a s s Wi z a r d C Wi n T h r e a d 2) C WinThread *pthread = AfxBeginThread( RUNTIME_CLASS( CWzdThread ) ); :: P o s t Q u i t M e s s a g e ( a rg ) a rg a rg int arg = pthread -> GetExitCodeThread(); W i n d o w s ::PostQuitMessage (arg) 58 4. ( ) 5. Te s t W z d 6. #if!defined( AFX_WZDTHREAD_H 411 A E 4 C 2 _ E 5 1 5 _ 11D1_9B80_00AA003D8695 INCLUDED_ )

340 #define AFX_WZDTHREAD_H 411 A E 4 C 2 _ E 5 1 5 _ 11 D 1 _ 9 B 8 0 _ 0 0 A A 0 0 3 D 8 6 9 5 I N C L U D E D _ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 // WzdThread.h : header file // #include "WzdDialog.h" / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // CWzdThread thread class CWzdThread : public CWi n T h r e a d D E C L A R E _ D Y N C R E ATE( CWzdThread ) p r o t e c t e d : CWzdThread(); // protected constructor used by dynamic creation // Attributes p u b l i c : // Operations p u b l i c : // Overrides // ClassWizard generated virtual function overrides // AFX_VIRTUAL( CWzdThread ) p u b l i c : virtual BOOL InitInstance(); virtual int ExitInstance(); // AFX_VIRT U A L // Implementation p r o t e c t e d : virtual ~CWzdThread(); // Generated message map functions // AFX_MSG( CWzdThread ) // NOTE - the ClassWizard will add and remove member functions here. // AFX_MSG D E C L A R E _ M E S S A G E _ M A P () p r i v a t e : CWzdDialog m_dlg; ; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // AFX_INSERT _ L O C AT I O N // Microsoft Developer Studio will insert additional declarations immediately

14 341 // before the previous line. # e n d i f //!defined( AFX_WZDTHREAD_H 411 A E 4 C 2 _ E 515 _ 11D1_9B80_00AA003D8695 INCLUDED_ ) // WzdThread.cpp : implementation file // #include "stdafx.h" #include "wzd.h" #include "WzdThread.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = FILE ; # e n d i f / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // CWzdThread I M P L E M E N T _ D Y N C R E ATE( CWzdThread, CWinThread ) C W z d T h r e a d : : C W z d T h r e a d ( ) C W z d T h r e a d : : ~ C W z d T h r e a d ( ) BOOL CWzdThread::InitInstance() m_dlg.create( IDD_WZD_DIALOG ); m _ d l g. S h o w Window( SW_SHOW ); m_pmainwnd = &m_dlg; return TRUE; // can end thread by returning FALSE here int CWzdThread::ExitInstance() m _ d l g. D e s t r o y Wi n d o w (); return CWi n T h r e a d :: E x i t I n s t a n c e (); BEGIN_MESSAGE_MAP( CWzdThread, CWinThread ) // AFX_MSG_MAP( CWzdThread ) // NOTE - the ClassWizard will add and remove mapping macros here. // AFX_MSG_MAP E N D _ M E S S A G E _ M A P ()

342 14.6 58 1. 2. C W n d :: S e n d M e s s a g e () S e n d M e s s a g e ( C Wi n T h r e a dp o s t T h r e a d M e s s a g e () P o s t T h r e a d M e s s a g e () SendMessage () 3. #define WM_WZDKILLTHREAD WM_USER + 1 C Wi n T h e a d m_pthread = AfxBeginThread( RUNTIME_CLASS( CWzdThread ) ); P o s t T h r e a d M e s s a g e () m_pthread -> PostThreadMessage( WM_WZDKILLTHREAD, 0, 0 ); C l a s s Wi z a r d BEGIN_MESSAGE_MAP( CWzdThread, CWinThread ) // AFX_MSG_MAP( CWzdThread ) // AFX_MSG_MAP ON_THREAD_MESSAGE( WM_WZDKILLTHREAD,OnKillThread ) E N D _ M E S S A G E _ M A P ( ) :: P o s t Q u i t M e s s a g e () L R E S U LT CWzdThread::OnKillThread( WPARAM wparam,lparam lparam ) ::PostQuitMessage( 0 ); return 0; // returned to PostThreadMessage() 4. P o s t T h r e a d M e s s a g e () b K i l l ( 49 ) ON_REGISTER_THREAD_MESSAGE( registered_message_id, process )

14 343 5. Te s t W z d E n d 14.7 59 1. 2. M F C C M u t e x C S i n g l e L o c k C M u l t i L o c k 3. C M u t e x class CWzdData : public CObject ; : : : // synchronization protection CMutex m_mutex; : : : void CWzdData::GetData( int *pint,float *pfloat,dword *pword ) *pint = m_nint; *pfloat = m_ffloat; * p Word = m_dwwo r d ; void CWzdData::SetData( int nint,float ffloat,dword dwword ) m_nint = nint; m_ffloat = ffloat; m _ d w Word = dwwo r d ; C M u t e x S e t D a t a () C S i n g l e L o c k C S i n g l e L o c k L o c k ( ) BOOL CWzdData::SetData( int nint,float ffloat,dword dwword ) CSingleLock slock( &m_mutex ); if ( slock.lock( 1000 ) ) // timeout in milliseconds,

344 // default = INFINITE // set values can also be lists and arrays m_nint = nint; m_ffloat = ffloat; m _ d w Word = dwwo r d ; return TRUE; return FA L S E ; // timed out! // unlocks on return or you can call slock.unlock(); L o c k () L o c k () FA L S E C M u t e x C M u l t i L o c k CMutex mutex[2]; mutex[0] = &mutex1; mutex[1] = &mutex2; CMultiLock mlock( mutex,2 ); if ( mlock.lock( 1000 ) ) // where 2 is the number of mutexes 4. C M u t e x 1 C M u t e x 3 : : C r e a t e M u t e x () Windows API :: C r e a t e M u t e x () M u t e x 51 Wi n d o w s C O b L i s t 5. W z d D a t a. c p p G e t D a t a () Te s t W z d 6. #ifndef WZDDATA _ H #define WZDDATA _ H #include <afxmt.h> class CWzdData : public CObject p u b l i c : DECLARE_SERIAL( CWzdData ) C W z d D a t a ( ) ;

14 345 BOOL GetData( int *pint,float *pfloat,dword *pword ); BOOL SetData( int nint,float ffloat,dword dwword ); // synchronization protection CMutex m_mutex; // result data int m_nint; float m_ffloat; DWORD m_dwwo r d ; ; # e n d i f // WzdData.cpp : implementation of the CWzdData class // #include "stdafx.h" #include "WzdData.h" / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // CWzdData IMPLEMENT_SERIAL( CWzdData, CObject, 0 ) C W z d D a t a :: C W z d D a t a () m_nint = 0; m_ffloat = 0.0f; m _ d w Word = 0; BOOL CWzdData::GetData( int *pint,float *pfloat,dword *pword ) // we lock here too so that we ll never read half written data CSingleLock slock( &m_mutex ); if ( slock.lock( 1000 ) ) // timeout in milliseconds, default = INFINITE // get values can also be lists and arrays *pint = m_nint; *pfloat = m_ffloat; * p Word = m_dwwo r d ; return TRUE; return FALSE; // timed out! // unlocks on return or you can call slock.unlock();

346 BOOL CWzdData::SetData( int nint,float ffloat,dword dwword ) CSingleLock slock(&m_mutex); // or with CMultiLock can specify several // m_mutex s for waiting on several // data items if ( slock.lock( 1000 ) ) // timeout in milliseconds, // default = INFINITE // set values can also be lists and arrays m_nint = nint; m_ffloat = ffloat; m _ d w Word = dwwo r d ; return TRUE; return FALSE; // timed out! // unlocks on return or you can call slock.unlock();