討論區快速選單
知識庫快速選單
網路投保旅行平安險 政府補助!學嵌入式+物聯網 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
CreateThread 的作法
更改我的閱讀文章字型大小
作者 : kuolung(kuolung)
[ 貼文 143 | 人氣 1414 | 評價 130 | 評價/貼文 0.91 | 送出評價 35 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/3/3 上午 10:43:08
請問各位有用 mfc 的大大,如果在 mfc 的環境中要 create 一個 workthread 的方式

我目前的方法是先建一個

CWinThread 的物件

要啟動程式時就用

pWinTh = new MyWorkTh;
pWinTh->CreateThread();


然後把我的程式,寫在物件中的
InitInstance()

目前這樣是可以 work

但是覺得怪怪的,好像不是正規的作法,可否請大大指點一下,該如何做
作者 : ccl0504(手動程式產生器) 貼文超過200則
[ 貼文 448 | 人氣 211 | 評價 910 | 評價/貼文 2.03 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/3/3 下午 02:06:55

主程式 :
AfxBeginThread( RUNTIME_CLASS( CStatusThread ) );


Thread :

/////////////////////////////////////////////////////////////////////////////
// CStatusThread

IMPLEMENT_DYNCREATE(CStatusThread, CWinThread)

CStatusThread::CStatusThread()
{
}

CStatusThread::~CStatusThread()
{
}

BOOL CStatusThread::InitInstance()
{
ResetEvent( _hExitEvents[ID_EXIT_STATUS_THREAD] );

return true;
}

int CStatusThread::ExitInstance()
{
SetEvent( _hExitEvents[ID_EXIT_STATUS_THREAD] );

return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CStatusThread, CWinThread)
//{{AFX_MSG_MAP(CStatusThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStatusThread message handlers

BOOL CStatusThread::OnIdle(long lCount)
{
HANDLE hEvents[3];

hEvents[0] = _hShutdownEvent;
hEvents[1] = _hWorkEvents[ID_WORK_REFRESH_SYS_VARS];
hEvents[2] = _hWorkEvents[ID_WORK_REFRESH_SYS_LOGS];

switch( WaitForMultipleObjects( sizeof(hEvents) / sizeof(HANDLE), hEvents, false, 5000 ) )
{
case WAIT_OBJECT_0 + 0:
// shutdown event
PostQuitMessage( 0 );
return false;

case WAIT_OBJECT_0 + 1:
case WAIT_TIMEOUT:

break;

case WAIT_OBJECT_0 + 2:

if( _SysVars.pLogView )
_SysVars.pLogView->PostMessage( IDM_UPDATE );

ResetEvent( _hWorkEvents[ID_WORK_REFRESH_SYS_LOGS] );
break;
}

return true;
}

作者 : ccl0504(手動程式產生器) 貼文超過200則
[ 貼文 448 | 人氣 211 | 評價 910 | 評價/貼文 2.03 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/3/3 下午 02:13:15

另外主程式結束時需要通知 thread 關閉, 所以我會這樣做 :

全域變數 :

HANDLE _hShutdownEvent = NULL; // 主程式要通知要關閉的 event
HANDLE _hExitEvents[TOTAL_EXIT_EVENTS]; // thread 通知主程式關閉完成的 event
HANDLE _hWorkEvents[TOTAL_WORK_EVENTS]; // 主程式要 thread 工作的 event

主程式初始化全域變數 :
_hShutdownEvent = CreateEvent( NULL, true, false, NULL );
if( _hShutdownEvent == NULL )
{
return false;
}

for( i = 0; i < TOTAL_EXIT_EVENTS; i++ )
{
_hExitEvents[i] = CreateEvent( NULL, true, true, NULL );
if( _hExitEvents[i] == NULL )
return false;
}

for( i = 0; i < TOTAL_WORK_EVENTS; i++ )
{
_hWorkEvents[i] = CreateEvent( NULL, true, false, NULL );
if( _hWorkEvents[i] == NULL )
return false;
}
}


主程式關閉時 :
void CMainFrame::OnClose()
{
SetEvent( _hShutdownEvent );

Sleep( 100 );

if( WaitForMultipleObjects( TOTAL_EXIT_EVENTS, _hExitEvents, true, 2000 ) == WAIT_TIMEOUT )
GXTrace1( "CMainFrame::OnClose() = %s", GXGetLastErrorMessage() );
GXTrace0( "worker threads are closed" );
}
作者 : ccl0504(手動程式產生器) 貼文超過200則
[ 貼文 448 | 人氣 211 | 評價 910 | 評價/貼文 2.03 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/3/3 下午 02:15:23

所以配合主程式的 shutdown event, thread 會在進來跟離開的時候設定 exit event :

BOOL CStatusThread::InitInstance()
{
ResetEvent( _hExitEvents[ID_EXIT_STATUS_THREAD] );


return true;
}

int CStatusThread::ExitInstance()
{
SetEvent( _hExitEvents[ID_EXIT_STATUS_THREAD] );

return CWinThread::ExitInstance();
}
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.125