C 模仿Android實現Handler機制

2021-08-20 15:38:09 字數 3044 閱讀 1768

前言:

一直使用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 ...