using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace HPSocketCS
{
///
/// 名称:拒绝策略
/// 描述:调用被拒绝后的处理策略
///
public enum RejectedPolicy
{
///
/// 立刻返回失败
///
TRP_CALL_FAIL = 0,
///
/// 等待(直到成功、超时或线程池关闭等原因导致失败)
///
TRP_WAIT_FOR = 1,
///
/// 调用者线程直接执行
///
TRP_CALLER_RUN = 2,
}
///
/// 名称:任务缓冲区类型
/// 描述:TSockeTask 对象创建和销毁时,根据不同类型的缓冲区类型作不同的处理
///
public enum TaskBufferType
{
///
/// 深拷贝
///
TBT_COPY = 0,
///
/// 浅拷贝
///
TBT_REFER = 1,
///
/// 连接(不负责创建,但负责销毁)
///
TBT_ATTACH = 2,
}
/************************************************************************
************************************************************************/
///
/// 名称:任务处理函数
/// 描述:任务处理入口函数
/// 返回值:(无)
///
/// 自定义参数
public delegate void TaskProc(IntPtr pvArg);
///
/// 名称:Socket 任务处理函数
/// 描述:Socket 任务处理入口函数
/// 返回值:(无)
///
/// pTask -- Socket 任务结构体指针
public delegate void SocketTaskProc(SocketTask task);
///
/// 名称:Socket 任务结构体
/// 描述:封装 Socket 任务相关数据结构
///
[StructLayout(LayoutKind.Sequential)]
public struct SocketTask
{
///
/// 任务处理函数
///
public SocketTaskProc Fn;
///
/// 发起对象
///
public IntPtr Sender;
///
/// 连接 ID
///
public IntPtr ConnId;
///
/// 数据缓冲区
///
public IntPtr Buffer;
///
/// 数据缓冲区长度
///
public int BufferSize;
///
/// 缓冲区类型
///
public TaskBufferType BufferType;
///
/// 自定义参数
///
public IntPtr WParam;
///
/// 自定义参数
///
public IntPtr LParam;
}
public class ThreadPoolSdk
{
///
/// 创建 IHPThreadPool 对象
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern IntPtr Create_HP_ThreadPool();
///
/// 销毁 IHPThreadPool 对象
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern void Destroy_HP_ThreadPool(IntPtr pThreadPool);
///
/// 名称:创建 TSocketTask 对象
/// 描述:创建任务对象,该对象最终需由 HP_Destroy_SocketTaskObj() 销毁
///
/// 任务处理函数
/// 发起对象
/// 连接 ID
/// 数据缓冲区
/// 数据缓冲区长度
/// 数据缓冲区类型(默认:TBT_COPY)
/// 自定义参数
/// 自定义参数
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern IntPtr Create_HP_SocketTaskObj(SocketTaskProc fnTaskProc, IntPtr pSender, IntPtr dwConnID, byte[] pBuffer, int iBuffLen, TaskBufferType enBuffType /*= TBT_COPY*/, IntPtr wParam /*= 0*/, IntPtr lParam /*= 0*/);
///
/// 销毁 TSocketTask 对象
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern void Destroy_HP_SocketTaskObj(IntPtr pTask);
///
/// 名称:启动线程池组件
///
///
/// 线程数量,(默认:0)
/// 任务队列最大容量(默认:0,不限制)
/// 任务拒绝处理策略
/// 线程堆栈空间大小(默认:0 -> 操作系统默认)
/// TRUE -- 成功 , FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool HP_ThreadPool_Start(IntPtr pThreadPool, uint dwThreadCount /*= 0*/, uint dwMaxQueueSize /*= 0*/, RejectedPolicy enRejectedPolicy /*= TRP_CALL_FAIL*/, uint dwStackSize /*= 0*/);
///
/// 名称:关闭线程池组件
/// 描述:在规定时间内关闭线程池组件,如果工作线程在最大等待时间内未能正常关闭,会尝试强制关闭,这种情况下很可能会造成系统资源泄漏
///
///
/// 最大等待时间(毫秒,默认:INFINITE,一直等待)
/// TRUE -- 成功, FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool HP_ThreadPool_Stop(IntPtr pThreadPool, int dwMaxWait /*= INFINITE*/);
///
/// 名称:提交任务
/// 描述:向线程池提交异步任务
///
///
/// 任务处理函数
/// 任务参数
/// 任务提交最大等待时间(仅对 TRP_WAIT_FOR 类型线程池生效,默认:INFINITE,一直等待)
/// TRUE -- 成功, FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码, 其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool HP_ThreadPool_Submit(IntPtr pThreadPool, TaskProc fnTaskProc, IntPtr pvArg, int dwMaxWait /*= INFINITE*/);
///
/// 名称:提交 Socket 任务
/// 描述:向线程池提交异步 Socket 任务
///
///
/// 任务参数 HP_LPTSocketTask
/// 任务提交最大等待时间(仅对 TRP_WAIT_FOR 类型线程池生效,默认:INFINITE,一直等待)
/// TRUE -- 成功, FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool HP_ThreadPool_Submit_Task(IntPtr pThreadPool, IntPtr pTask, int dwMaxWait /*= INFINITE*/);
///
/// 名称:调整线程池大小
/// 描述:增加或减少线程池的工作线程数量
///
///
/// 线程数量
/// TRUE -- 成功, FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool HP_ThreadPool_AdjustThreadCount(IntPtr pThreadPool, int dwNewThreadCount);
///
/// 检查线程池组件是否已启动
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool HP_ThreadPool_HasStarted(IntPtr pThreadPool);
///
/// 查看线程池组件当前状态
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern ServiceState HP_ThreadPool_GetState(IntPtr pThreadPool);
///
/// 获取当前任务队列大小
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern uint HP_ThreadPool_GetQueueSize(IntPtr pThreadPool);
///
/// 获取工作线程数量
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern int HP_ThreadPool_GetThreadCount(IntPtr pThreadPool);
///
/// 获取任务队列最大容量
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern uint HP_ThreadPool_GetMaxQueueSize(IntPtr pThreadPool);
///
/// 获取任务拒绝处理策略
///
///
///
[DllImport(Sdk.HPSOCKET_DLL_PATH, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern RejectedPolicy HP_ThreadPool_GetRejectedPolicy(IntPtr pThreadPool);
}
}