|
Posted on 2009-09-20 16:53 S.l.e!ep.¢% 阅读(1300) 评论(1) 编辑 收藏 引用 所属分类: IOCP
IOCP 跟线程池脱不了关系
以前写过一个线程类 http://www.cppblog.com/sleepwom/archive/2009/02/07/73161.html
JetByteTools里的线程类是这样的,作了一些小改动
今天才知道,原来C++的虚函数可以写成 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
/**/
//////////////////////////////////////////////////////////////////////////////
/
使用也很简单 #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;
}
 调用 start() 线程就开始,退出程序时,如果允许就 wait(), 如果很急,就直接 Terminate(),
Feedback
# re: JetByteTools(二) 回复 更多评论
2009-09-21 15:18 by
JetByteTools代码可以提供一份吗?写了,好了好久没找到免费下载的。多谢了!
邮箱: zhlong.1988@163.com
|