#include #include #include #pragma warning(disable:4800) // int -> bool 性能损失警告 namespace hgl { /** * @param max_count 最大计数 */ Semaphore::Semaphore(int max_count) { ptr=CreateSemaphore(nullptr,0,max_count,nullptr); if(!ptr) LOG_ERROR(OS_TEXT("CreateSemaphore error,max_count=")+OSString(max_count)); } Semaphore::~Semaphore() { CloseHandle(ptr); } /** * 发送信号 * @param n 发送的信号数量 * @return 是否释放成功 */ bool Semaphore::Post(int n) { if(n<=0)return(false); return(ReleaseSemaphore(ptr,n,nullptr)); } /** * 尝试获取一个信号 * @return 是否有取得信号 */ bool Semaphore::TryAcquire() { return(WaitForSingleObject(ptr,0)==WAIT_OBJECT_0); } /** * 等待并获取一个信号 * @param time 等待的最长时间,使用0表示无限等待.(单位秒) * @return 是否等待到了,如果超过最长时间,仍未等到即为超时,返回false */ bool Semaphore::Acquire(double time_out) { return(WaitForSingleObject(ptr,time_out>0?DWORD(time_out*1000):INFINITE)==WAIT_OBJECT_0); } }//namespace hgl