|
Posted on 2009-09-20 16:53 S.l.e!ep.¢% 閱讀(1305) 評(píng)論(1) 編輯 收藏 引用 所屬分類: IOCP
IOCP 跟線程池脫不了關(guān)系
以前寫過一個(gè)線程類 http://www.shnenglu.com/sleepwom/archive/2009/02/07/73161.html
JetByteTools里的線程類是這樣的,作了一些小改動(dòng)
今天才知道,原來C++的虛函數(shù)可以寫成 private: ......
??? private?:

??????virtual?unsigned?int?Run()?=?0
#if
?defined?(_MSC_VER)?&&?(_MSC_VER?>=?1020)
#pragma?once
#endif
#ifndef?JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__
#define
?JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
//
?File???????????:?$Workfile:?Thread.h?$
//
?Version????????:?$Revision:?3?$
//
?Function???????:?
//
//
?Author?????????:?$Author:?Len?$
//
?Date???????????:?$Date:?20/05/02?23:17?$
//
//
?Notes??????????:?
//
//
?Modifications??:
//
//
?$Log:?/Clients/PayPoint/e-Voucher/JetByteTools/Win32Tools/Thread.h?$
//
?
//
?3?????20/05/02?23:17?Len
//
?Updated?copyright?and?disclaimers.
//
?
//
?2?????10/05/02?19:25?Len
//
?Lint?options?and?code?cleaning.
//
?
//
?1?????9/05/02?18:47?Len
//
?
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
//
?Copyright?1997?-?2002?JetByte?Limited.
//
//
?JetByte?Limited?grants?you?("Licensee")?a?non-exclusive,?royalty?free,?
//
?licence?to?use,?modify?and?redistribute?this?software?in?source?and?binary?
//
?code?form,?provided?that?i)?this?copyright?notice?and?licence?appear?on?all?
//
?copies?of?the?software;?and?ii)?Licensee?does?not?utilize?the?software?in?a?
//
?manner?which?is?disparaging?to?JetByte?Limited.
//
//
?This?software?is?provided?"as?is"?without?a?warranty?of?any?kind.?All?
//
?express?or?implied?conditions,?representations?and?warranties,?including
//
?any?implied?warranty?of?merchantability,?fitness?for?a?particular?purpose
//
?or?non-infringement,?are?hereby?excluded.?JetByte?Limited?and?its?licensors?
//
?shall?not?be?liable?for?any?damages?suffered?by?licensee?as?a?result?of?
//
?using,?modifying?or?distributing?the?software?or?its?derivatives.?In?no
//
?event?will?JetByte?Limited?be?liable?for?any?lost?revenue,?profit?or?data,
//
?or?for?direct,?indirect,?special,?consequential,?incidental?or?punitive
//
?damages,?however?caused?and?regardless?of?the?theory?of?liability,?arising?
//
?out?of?the?use?of?or?inability?to?use?software,?even?if?JetByte?Limited?
//
?has?been?advised?of?the?possibility?of?such?damages.
//
//
?This?software?is?not?designed?or?intended?for?use?in?on-line?control?of?
//
?aircraft,?air?traffic,?aircraft?navigation?or?aircraft?communications;?or?in?
//
?the?design,?construction,?operation?or?maintenance?of?any?nuclear?
//
?facility.?Licensee?represents?and?warrants?that?it?will?not?use?or?
//
?redistribute?the?Software?for?such?purposes.?
//

/**/
//////////////////////////////////////////////////////////////////////////////
/

//////////////////////////////////////////////////////////////////////////////
/
//
?Lint?options
//
//
lint?-save
//
lint?-esym(1704,?CThread::CThread)???private?(copy)?constructor?
//

/**/
//////////////////////////////////////////////////////////////////////////////
/
#ifndef?_WINDOWS_
#define
?WIN32_LEAN_AND_MEAN
#include?
<
windows.h
>
#undef
?WIN32_LEAN_AND_MEAN
#endif
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?Namespace:?JetByteTools::Win32
/**/
//////////////////////////////////////////////////////////////////////////////
/
namespace
?JetByteTools?
{

namespace
?Win32?
{


/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?CThread
/**/
//////////////////////////////////////////////////////////////////////////////
/
class
?CThread?

{
???
public
?:
???
??????CThread();
??????
??????
virtual
?
~
CThread();

??????HANDLE?GetHandle();

??????
void
?Wait()?
const
;

??????
bool
?Wait(DWORD?timeoutMillis)?
const
;

??????
void
?Start();

??????
void
?Terminate(DWORD?exitCode?
=
?
0
);

???
private
?:

??????
virtual
?unsigned?
int
?Run()?
=
?
0
;

??????
static
?unsigned?
int
?__stdcall?ThreadFunction(
void
?
*
pV);

??????HANDLE?m_hThread;

??????
//
?No?copies?do?not?implement
??????CThread(
const
?CThread?
&
rhs);
??????CThread?
&
operator
=
(
const
?CThread?
&
rhs);
}
;


/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?Namespace:?JetByteTools::Win32
/**/
//////////////////////////////////////////////////////////////////////////////
/
}
?
//
?End?of?namespace?Win32
}
?
//
?End?of?namespace?JetByteTools?
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?Lint?options
//
//
lint?-restore
//

/**/
//////////////////////////////////////////////////////////////////////////////
/
#endif
?
//
?JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?End?of?file
/**/
//////////////////////////////////////////////////////////////////////////////
/
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
//
?File???????????:?$Workfile:?Thread.cpp?$
//
?Version????????:?$Revision:?3?$
//
?Function???????:?
//
//
?Author?????????:?$Author:?Len?$
//
?Date???????????:?$Date:?20/05/02?23:17?$
//
//
?Notes??????????:?
//
//
?Modifications??:
//
//
?$Log:?/Clients/PayPoint/e-Voucher/JetByteTools/Win32Tools/Thread.cpp?$
//
?
//
?3?????20/05/02?23:17?Len
//
?Updated?copyright?and?disclaimers.
//
?
//
?2?????10/05/02?19:25?Len
//
?Lint?options?and?code?cleaning.
//
?
//
?1?????9/05/02?18:47?Len
//
?
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
//
?Copyright?1997?-?2002?JetByte?Limited.
//
//
?JetByte?Limited?grants?you?("Licensee")?a?non-exclusive,?royalty?free,?
//
?licence?to?use,?modify?and?redistribute?this?software?in?source?and?binary?
//
?code?form,?provided?that?i)?this?copyright?notice?and?licence?appear?on?all?
//
?copies?of?the?software;?and?ii)?Licensee?does?not?utilize?the?software?in?a?
//
?manner?which?is?disparaging?to?JetByte?Limited.
//
//
?This?software?is?provided?"as?is"?without?a?warranty?of?any?kind.?All?
//
?express?or?implied?conditions,?representations?and?warranties,?including
//
?any?implied?warranty?of?merchantability,?fitness?for?a?particular?purpose
//
?or?non-infringement,?are?hereby?excluded.?JetByte?Limited?and?its?licensors?
//
?shall?not?be?liable?for?any?damages?suffered?by?licensee?as?a?result?of?
//
?using,?modifying?or?distributing?the?software?or?its?derivatives.?In?no
//
?event?will?JetByte?Limited?be?liable?for?any?lost?revenue,?profit?or?data,
//
?or?for?direct,?indirect,?special,?consequential,?incidental?or?punitive
//
?damages,?however?caused?and?regardless?of?the?theory?of?liability,?arising?
//
?out?of?the?use?of?or?inability?to?use?software,?even?if?JetByte?Limited?
//
?has?been?advised?of?the?possibility?of?such?damages.
//
//
?This?software?is?not?designed?or?intended?for?use?in?on-line?control?of?
//
?aircraft,?air?traffic,?aircraft?navigation?or?aircraft?communications;?or?in?
//
?the?design,?construction,?operation?or?maintenance?of?any?nuclear?
//
?facility.?Licensee?represents?and?warrants?that?it?will?not?use?or?
//
?redistribute?the?Software?for?such?purposes.?
//

/**/
//////////////////////////////////////////////////////////////////////////////
/
#include?
"
Thread.h
"
#include?
<
process.h
>
#include?
"
Win32Exception.h
"
#include?
"
Utils.h
"
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?Lint?options
//
//
lint?-save
//
lint?-esym(1763,?CThread::GetHandle)?const?member?indirectly?modifies?obj
//
//
?Member?not?defined
//
lint?-esym(1526,?CThread::CThread)
//
lint?-esym(1526,?CThread::operator=)
//

/**/
//////////////////////////////////////////////////////////////////////////////
/

//////////////////////////////////////////////////////////////////////////////
/
//
?Namespace:?JetByteTools::Win32
/**/
//////////////////////////////////////////////////////////////////////////////
/
namespace
?JetByteTools?
{

namespace
?Win32?
{


/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?CThread
/**/
//////////////////////////////////////////////////////////////////////////////
/
CThread::CThread()
???:??m_hThread(INVALID_HANDLE_VALUE)

{

}
??????
CThread::
~
CThread()

{
???
if
?(m_hThread?
!=
?INVALID_HANDLE_VALUE)
 ???
{
??????(
void
)?::CloseHandle(m_hThread);
???}
???m_hThread?
=
?NULL;

???
//
lint?-e{1540}?m_hThread?neither?freed?nor?zeroed?in?destructor
}
HANDLE?CThread::GetHandle()

{
???
return
?m_hThread;
}
void
?CThread::Start()

{
???
if
?(m_hThread?
==
?INVALID_HANDLE_VALUE)
 ???
{
??????unsigned?
int
?threadID?
=
?
0
;

??????m_hThread?
=
?(HANDLE)::_beginthreadex(
0
,?
0
,?ThreadFunction,?(
void
*
)
this
,?
0
,?
&
threadID);

??????
if
?(m_hThread?
==
?INVALID_HANDLE_VALUE)
 ??????
{
?????????
throw
?CWin32Exception(_T(
"
CThread::Start()?-?_beginthreadex
"
),?GetLastError());
??????}
???}
???
else
???
{
??????
throw
?CException(_T(
"
CThread::Start()
"
),?_T(
"
Thread?already?running?-?you?can?only?call?Start()?once!
"
));
???}
}
void
?CThread::Wait()?
const
{
???
if
?(
!
Wait(INFINITE))
 ???
{
??????
throw
?CException(_T(
"
CThread::Wait()
"
),?_T(
"
Unexpected?timeout?on?infinite?wait
"
));
???}
}
bool
?CThread::Wait(DWORD?timeoutMillis)?
const
{
???
//
?TODO?base?class??Waitable?
???
bool
?ok;

???DWORD?result?
=
?::WaitForSingleObject(m_hThread,?timeoutMillis);

???
if
?(result?
==
?WAIT_TIMEOUT)
 ???
{
??????ok?
=
?
false
;
???}
???
else
?
if
?(result?
==
?WAIT_OBJECT_0)
 ???
{
??????ok?
=
?
true
;
???}
???
else
???
{
??????
throw
?CWin32Exception(_T(
"
CThread::Wait()?-?WaitForSingleObject
"
),?::GetLastError());
???}
????
???
return
?ok;
}
unsigned?
int
?__stdcall?CThread::ThreadFunction(
void
?
*
pV)

{
???unsigned?
int
?result?
=
?
0
;

???CThread
*
?pThis?
=
?(CThread
*
)pV;
???
???
if
?(pThis)
 ???
{
??????
try
??????
{
?????????result?
=
?pThis
->
Run();
??????}
??????
catch
( )
 ??????
{
??????????DEBUG_ONLY(Output(_T(
"
CThread::ThreadFunction()?-?Unknown?Exception
"
))?);
??????}
???}
???
return
?result;
}
void
?CThread::Terminate(
 ???DWORD?exitCode?
/**/
/*
?=?0?
*/
)

{
???
if
?(
!
::TerminateThread(m_hThread,?exitCode))
 ???
{
??????
//
?TODO?we?could?throw?an?exception?here
???}
}
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?Namespace:?JetByteTools::Win32
/**/
//////////////////////////////////////////////////////////////////////////////
/
}
?
//
?End?of?namespace?Win32
}
?
//
?End?of?namespace?JetByteTools?
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
?Lint?options
//
//
lint?-restore
//

/**/
//////////////////////////////////////////////////////////////////////////////
/

//////////////////////////////////////////////////////////////////////////////
/
//
?End?of?file
/**/
//////////////////////////////////////////////////////////////////////////////
/
使用也很簡(jiǎn)單 #include?<stdio.h>
#include?"Thread.h"

class?CThreadTest?:?public?JetByteTools::Win32::CThread
  {
public:

private:
????virtual?unsigned?int?Run()
 ???? {
????????printf("Run?Thread\n");
????????
????????while(true)
 ???????? {
????????}

????????return?0;
????}
};

int?main()
  {
????CThreadTest?test;
????test.Start();
????
????(void)test.Wait(1000);

????test.Terminate();

????printf("success\n");
????return?0;
}
 調(diào)用 start() 線程就開始,退出程序時(shí),如果允許就 wait(), 如果很急,就直接 Terminate(),
Feedback
JetByteTools代碼可以提供一份嗎?寫了,好了好久沒找到免費(fèi)下載的。多謝了!
郵箱: zhlong.1988@163.com
|