简单代码实现如下:
#pragma once
#include<Windows.h>
#include<stdio.h>
#include<signal.h>
class SyncEvent
{
public:
SyncEvent(bool manual_reset = true, bool signaled = false) {
handle_ = ::CreateEvent(NULL, manual_reset, signaled, NULL);
if (!handle_) {
}
}
//SyncEvent() {
// ::CloseHandle(handle_);
//}
void Reset() {
::ResetEvent(handle_);
}
void Signal() {
::SetEvent(handle_);
}
bool IsSignaled() {
return TimedWait(0);
}
void Wait() {
}
bool TimedWait(UINT32 timeout_ms)
{
DWORD result = WaitForSingleObject(handle_, static_cast<DWORD>(timeout_ms));
switch (result)
{
case WAIT_OBJECT_0:
return true;
case WAIT_TIMEOUT:
return false;
}
return false;
}
private:
HANDLE handle_;
};
示例如下:
signal.h
#pragma once
#include<string>
#include<thread>
#include<iostream>
#include"plamt.h"
class Signal
{
public:
Signal():worked_thread_(std::bind(&Signal::OnRun, this)) {}
~Signal() {}
void Init();
void OnMessage();
void OnRun();
void Realease();
private:
SyncEvent sync_event_;
bool is_run_{ false };
bool init_{ false };
std::thread worked_thread_;
};
signal.cpp
#include "signal.h"
void Signal::Init()
{
is_run_ = true;
init_ = false;
}
void Signal::OnMessage()
{
std::cout << "************** OnMessage **************" << std::endl;
sync_event_.Signal();
}
void Signal::OnRun()
{
std::cout << "************** worked_thread starting **************" << std::endl;
while (is_run_)
{
sync_event_.TimedWait(3000);
std::cout << "************** OnRun **************" << std::endl;
sync_event_.Reset();
}
}
void Signal::Realease()
{
if (is_run_)
is_run_ = false;
if (worked_thread_.joinable())
worked_thread_.join();
}
main.cpp
#include<iostream>
#include<Windows.h>
#include"signal.h"
using namespace std;
int main()
{
Signal signal_test;
signal_test.Init();
while (true)
{
Sleep(1000);
signal_test.OnMessage();
}
system("pause");
return 0;
}
运行结果如下: