前言:
一直使用android的handler,感覺非常好用,但是當我使用c++程式設計時,想使用android handler一樣的程式設計模式,竟不知如何下手,網上找了很久,都沒找到具體的實現,能搜尋到mfc中使用handler,但是一直不搞windows的開發,也不曉得上哪兒去弄,也可能是我找的不夠多吧。這個handler已經嚴重的影響了我,沒有它左右不舒服。這兩天沉下心來自己寫了乙個,省的自己去找了,以後肯定還能用到,最好有網友也做了類似實現,我可以借鑑下以提公升自己。
**參考android handler,有興趣的朋友可以去看看android 裡面的實現。
handler.h
#pragma once
#ifndef handler_h
#define handler_h
#include #include #include #include #include #include "message.h"
/* * handler will run in it's own thread, you don't want to care about it.
* message will be proccess by the handler. two ways to add your task to the handler.
* 1. send message to the handler
* 2. post the task(function) to handler
*/class handler
};private:
std::vectormsg_q;
std::mutex queue_mutex;
std::condition_variable condition;
std::thread looper;
bool stop;
bool stopwhenempty;
};#endif
handler.cpp
#include #include #include #include "handler.h"
#include "message.h"
#define logenter (std::cout << "this is function " << __func__<< std::endl)
handler::handler():stop(false),stopwhenempty(false));
}else);
}if(this->stopwhenempty && this->msg_q.empty())
return;
if(stop)
msg = std::move(msg_q.back());
msg_q.pop_back();
}this->dispatchmessage(msg);
}});
}handler::~handler()
condition.notify_all();
looper.join();
msg_q.clear();
}void handler::handlemessage(message& msg)
bool handler::sendmessageattime(message& msg, long uptimemillis)
bool handler::sendmessage(message& msg)
bool handler::sendemptymessage(int what)
bool handler::sendemptymessage(int what,long uptimemillis)
msg_q.push_back(msg);
// std::sort(msg_q.begin(), msg_q.end(),valcomp());
// 跟進時間進行降序排列
std::sort(msg_q.begin(), msg_q.end(),std::greater());
condition.notify_one();
return true;
}bool handler::post(message::function f)
bool handler::postattime(message::function f, long uptimemillis)
std::unique_locklock(queue_mutex);
message msg;
msg.setwhen(uptimemillis);
msg.setfunction(f);
msg_q.push_back(msg);
std::sort(msg_q.begin(), msg_q.end(),std::greater());
return true;
}void handler::removemessages(int what)
condition.notify_one();
}void handler::removecallbackandmessages()
void handler::stopsafty(bool stopsafty)else
}bool handler::isquiting()
void handler::dispatchmessage(message& msg)else
}
使用:
class myhandler : public handler
cout << "in myhandler case: " << msg.m_what << endl;
}};int main(int argc, char **argv)
hdlr.postattime((), 230);
hdlr.stopsafty(true); //停止handler,在停止前處理完所有訊息
while(true)
return 1;
}
這裡只帖出handler的實現,還有個配套的message實現,感興趣的童鞋自己去下面鏈結檢視吧。
python 單例模式的實現 Han
單例模式 個人理解 減少重複建立相同物件,節約時間空間成本 前提是重複建立同種物件 一種常用的軟體設計模式 實現 python class singleton object instance none def new cls,args,kwargs if cls.instance is none c...
模仿Wireshark網路抓包工具實現 c
其實叫抓包工具,其實就是抓取流經自己網絡卡的所有ip包,我們能夠按照ip包的協議解析不就行了。實現的核心在這裡 1 建立socket 2 sock socket af inet,sock raw,ipproto ip 3if sock invalid socket 4 8 獲取本機位址 9char ...
模仿Wireshark網路抓包工具實現 c
其實叫抓包工具,其實就是抓取流經自己網絡卡的所有ip包,我們能夠按照ip包的協議解析不就行了。實現的核心在這裡 1 建立socket 2 sock socket af inet,sock raw,ipproto ip 3if sock invalid socket 4 8 獲取本機位址 9char ...