何删除定时器?MyLibco协程网络库定时器的设计
时间戳类(基本摘自muduo)
//Timestamp.h
namespace Tattoo{class Timestamp{public: Timestamp(); explicit Timestamp(int64_t microSecondsSinceEpoch); void swap(Timestamp &that) {std::swap(microSecondsSinceEpoch_, that.microSecondsSinceEpoch_); } std::string toString() const; std::string toFormattedString() const; //微妙大于0就是 valid 的 bool valid() const {return microSecondsSinceEpoch_ > 0; } int64_t microSecondsSinceEpoch() const {return microSecondsSinceEpoch_; } //微秒转化为秒 time_t secondsSinceEpoch() const {return static_cast(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); } //得到现在的时间 static Timestamp now(); //获取一个无效时间,即时间等于0 static Timestamp invalid(); //一百万,一微秒等于百万分之一秒 static const int kMicroSecondsPerSecond = 1000 * 1000; private: int64_t microSecondsSinceEpoch_;};// 这里重载 < 号,在下文的multimap 中就会用到inline bool operator<(Timestamp lhs, Timestamp rhs){return lhs.microSecondsSinceEpoch() < rhs.microSecondsSinceEpoch();}inline bool operator==(Timestamp lhs, Timestamp rhs){return lhs.microSecondsSinceEpoch() == rhs.microSecondsSinceEpoch();}将返回两个事件时间差的秒数,注意单位!inline double timeDifference(Timestamp high, Timestamp low){int64_t diff = high.microSecondsSinceEpoch() - low.microSecondsSinceEpoch(); return static_cast(diff) / Timestamp::kMicroSecondsPerSecond;}//把秒转化为微秒,构造一个对象,再把它们的时间加起来,构造一个无名临时对象返回inline Timestamp addTime(Timestamp timestamp, double seconds){int64_t delta = static_cast(seconds * Timestamp::kMicroSecondsPerSecond); return Timestamp(timestamp.microSecondsSinceEpoch() + delta);}} // namespace Tattoo
(资料图片仅供参考)
//Timestamp.cpp
using namespace Tattoo;Timestamp::Timestamp() : microSecondsSinceEpoch_(0){}Timestamp::Timestamp(int64_t microseconds) : microSecondsSinceEpoch_(microseconds){}std::string Timestamp::toString() const{char buf[32] = {0}; int64_t seconds = microSecondsSinceEpoch_ / kMicroSecondsPerSecond; int64_t microseconds = microSecondsSinceEpoch_ % kMicroSecondsPerSecond; //PRId64跨平台打印64位整数,因为int64_t用来表示64位整数,在32位系统中是long long int,64位系统中是long int //所以打印64位是%ld或%lld,可移植性较差,不如统一同PRID64来打印。 snprintf(buf, sizeof(buf) - 1, "%" PRId64 ".%06" PRId64 "", seconds, microseconds); return buf;}//把它转换成一个格式化字符串std::string Timestamp::toFormattedString() const{char buf[32] = {0}; time_t seconds = static_cast(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); int microseconds = static_cast(microSecondsSinceEpoch_ % kMicroSecondsPerSecond); struct tm tm_time; gmtime_r(&seconds, &tm_time); snprintf(buf, sizeof(buf), "%4d%02d%02d %02d:%02d:%02d.%06d", tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, microseconds); return buf;}Timestamp Timestamp::now(){struct timeval tv; gettimeofday(&tv, NULL); //获得当前时间,第二个参数是一个时区,当前不需要返回时区,就填空指针 int64_t seconds = tv.tv_sec; //取出秒数 return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);}Timestamp Timestamp::invalid(){return Timestamp();}
定时器
在这里,我是直接让协程在一段时间之后唤醒即可(runAfter),至于需不需要 repeat ,这个我也在思考当中,以后了解到了再加吧!!学习也就是一点一点积累的过程啦!!! //Timer.h
/*定时器类*/class Timer{public: Timer(Timestamp when); Timestamp expiration() const {return expire_; } void run() const; Timestamp expire_; //任务的超时时间 Routine_t *timer_rou_;};
//Timer.cpp
Timer::Timer(Timestamp when) : timer_rou_(get_curr_routine()), //一个定时器对应一个协程 expire_(when){}void Timer::run() const{cout << "由定时器唤醒对应协程" << endl; timer_rou_->Resume();}
定时器容器
.h 文件
class TimeHeap{public: TimeHeap(EventLoop *loop); ~TimeHeap(); Timer *addTimer(Timestamp when); void delTimer(Timer *timer); private: typedef std::pairEntry; typedef std::multimapTimerMap; // 超时之后的可读回调 void handleRead(); std::vectorgetExpired(Timestamp now); /* 重置超时的定时器 */ void reset(const std::vector&expired, Timestamp now); bool insert(Timer *timer); EventLoop *loop_; const int timerfd_; Channel timerfdChannel_; TimerMap timers_;};
.cpp 文件
namespace Tattoo{namespace detail{//创建 timerfdint createTimerfd(){int timerfd = ::timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC); if (timerfd < 0) {std::cout << "Failed in timerfd_create" << std::endl; } return timerfd;}/* 计算超时时间与当前时间的时间差,并将参数转换为 api 接受的类型 */struct timespec howMuchTimeFromNow(Timestamp when){/* 微秒数 = 超时时刻微秒数 - 当前时刻微秒数 */ int64_t microseconds = when.microSecondsSinceEpoch() - Timestamp::now().microSecondsSinceEpoch(); if (microseconds < 100) {microseconds = 100; } struct timespec ts; // 转换成 struct timespec 结构返回 // tv_sec 秒 // tv_nsec 纳秒 ts.tv_sec = static_cast( microseconds / Timestamp::kMicroSecondsPerSecond); ts.tv_nsec = static_cast( (microseconds % Timestamp::kMicroSecondsPerSecond) * 1000); return ts;}/* 读timerfd,避免定时器事件一直触发 */void readTimerfd(int timerfd, Timestamp now){uint64_t howmany; ssize_t n = ::read(timerfd, &howmany, sizeof(howmany)); std::cout << "TimerQueue::handleRead() " << howmany << " at " << now.toString() << std::endl; if (n != sizeof howmany) {std::cout << "TimerQueue::handleRead() reads " << n << " bytes instead of 8" << std::endl; }}/* 重置 timerfd 的超时时间 */void resetTimerfd(int timerfd, Timestamp expiration){struct itimerspec newValue; struct itimerspec oldValue; bzero(&newValue, sizeof newValue); bzero(&oldValue, sizeof oldValue); newValue.it_value = howMuchTimeFromNow(expiration); //到这个时间后,会产生一个定时事件 int ret = ::timerfd_settime(timerfd, 0, &newValue, &oldValue); if (ret) {std::cout << "timerfd_settime()" << std::endl; }}} // namespace detail} // namespace Tattoousing namespace Tattoo;using namespace Tattoo::detail;TimeHeap::TimeHeap(EventLoop *loop) : loop_(loop), timerfd_(createTimerfd()), timerfdChannel_(loop, timerfd_), timers_(){// 设置自己独特的回调函数,并不是和普通的Channel 一样,直接唤醒了对应的协程 timerfdChannel_.setHandleCallback( std::bind(&TimeHeap::handleRead, this)); timerfdChannel_.enableReading();}TimeHeap::~TimeHeap(){timerfdChannel_.disableAll(); ::close(timerfd_); for (auto it = timers_.begin(); it != timers_.end(); ++it) {delete it->second; }}/* 添加一个定时器 ,返回定时器指针,会在 channel->addEpoll 函数中使用到,因为要删除对应的定时器*/Timer *TimeHeap::addTimer(Timestamp when){Timer *timer = new Timer(when); 如果当前插入的定时器 比队列中的定时器都早 则返回真 bool earliestChanged = insert(timer); //最早的超时时间改变了,就需要重置timerfd_的超时时间 if (earliestChanged) {//timerfd_ 重新设置超时时间,使得 timerfd 的定时事件始终是最小的 resetTimerfd(timerfd_, timer->expiration()); } return timer;}/* 删除一个定时器 */void TimeHeap::delTimer(Timer *timer){auto it = timers_.find(timer->expire_); if (it != timers_.end()) {timers_.erase(it); } return;}//timerfd 可读 的回调void TimeHeap::handleRead(){Timestamp now(Timestamp::now()); //先读取 readTimerfd(timerfd_, now); std::vectorexpired = getExpired(now); for (std::vector::iterator it = expired.begin(); it != expired.end(); ++it) {it->second->run(); //run->Resume() } reset(expired, now); //这里主要是改变 timerfd 的定时最小值}//获取所有超时的定时器std::vectorTimeHeap::getExpired(Timestamp now){std::vectorexpired; auto it = timers_.lower_bound(now); assert(it == timers_.end() || now < it->first); std::copy(timers_.begin(), it, back_inserter(expired)); timers_.erase(timers_.begin(), it); return expired;}void TimeHeap::reset(const std::vector&expired, Timestamp now){Timestamp nextExpire; for (std::vector::const_iterator it = expired.begin(); it != expired.end(); ++it) {delete it->second; } if (!timers_.empty()) //timers_ 不为空 {/*获取当前定时器集合中的最早定时器的时间戳,作为下次超时时间*/ nextExpire = timers_.begin()->second->expiration(); } //如果取得的时间 >0就改变 timerfd 的定时 if (nextExpire.valid()) {resetTimerfd(timerfd_, nextExpire); }}bool TimeHeap::insert(Timer *timer){bool earliestChanged = false; Timestamp when = timer->expiration(); auto it = timers_.begin(); if (it == timers_.end() || when < it->first) {earliestChanged = true; } timers_.insert(std::make_pair(when, timer)); return earliestChanged;}
OK,上面的就是具体的实现代码了,下面来说一下几个点:
1.如何添加定时器?
在我写的协程库中是这样实现的: Channel::addEpoll()->loop_->runAfter(10)->timerHeap_->addTimer()
2.如何删除定时器?
loop_->cancel()->timerHeap_->delTimer()
3.如何将timerfd与Eventloop 统一起来?
首先来看一下eventloop:
.h
#include "Callbacks.h"#include "Timestamp.h"#include#include#include "routine.h"namespace Tattoo{class Channel;class Epoll;class TimeHeap;class Timer;class RoutineEnv_t;class EventLoop{public: EventLoop(); ~EventLoop(); void loop(); // timers Timer *runAt(const Timestamp &time); Timer *runAfter(double delay); void cancel(Timer *timer); void updateChannel(Channel *channel); void removeChannel(Channel *channel); private: typedef std::vectorChannelList; Epoll *epoll_; TimeHeap *timerHeap_; ChannelList activeChannels_; RoutineEnv_t *rouEnv_;};} // namespace Tattoo
.cpp
#include#include "Channel.h"#include "Epoll.h"#include "MiniHeap.h"#include "EventLoop.h"using namespace Tattoo;const int kPollTimeMs = 10000; // 10 sEventLoop::EventLoop() : rouEnv_(get_curr_thread_env()), // 一个 eventloop 对应一个 Routine_env epoll_(new Epoll(this)), timerHeap_(new TimeHeap(this)) //在TimeHead初始化时,就会将 timerfd 加入 epoll 监听中{// std::cout << "EventLoop created " << this << std::endl; rouEnv_->envEventLoop_ = this; //关键点}EventLoop::~EventLoop(){}void EventLoop::loop(){while (1) {activeChannels_.clear(); int ret = epoll_->poll(kPollTimeMs, &activeChannels_); for (auto it = activeChannels_.begin(); it != activeChannels_.end(); ++it) {(*it)->handleEvent(); //事件分发,记得注册时间回调(一般就是 Resume()) } } std::cout << "EventLoop " << this << " stop looping" << std::endl;}Timer *EventLoop::runAt(const Timestamp &time){return timerHeap_->addTimer(time);}Timer *EventLoop::runAfter(double delay){Timestamp time(addTime(Timestamp::now(), delay)); runAt(time);}void EventLoop::cancel(Timer *timer){timerHeap_->delTimer(timer);}void EventLoop::updateChannel(Channel *channel){epoll_->updateChannel(channel);}void EventLoop::removeChannel(Channel *channel){epoll_->removeChannel(channel);}
4.定时器的组织方式(和 muduo 差不多,他用的是set,我用的是 multimap)
muduo定时器容器封装了 Timer.h里面保存的是超时时间和回调函数, TimerQueue.h使用set容器保存多个定时器, 然后在TimerQueue中使用timerfd_create创建一个timerfd句柄, 插入定时器A后先比较A的触发时间和TimerQueue的触发时间, 如果A的触发时间比其小就使用timerfd_settime重置TimerQueue的timerfd的触发时间, TimerQueue中的timerfd的触发时间永远与保存的定时器中触发时间最小的那个相同, 然后timerfd触发可读后, 遍历保存的多个定时器, 看看有没有同时到期的, 有执行回调函数
4.协程库中定时器的使用(与 libco 基本一样)
先行阅读:https://blog.csdn.net/liushengxi_root/article/details/88421955 主要函数(addEpoll):
void Channel::addEpoll(){//这里就设置的回调函数和 timerfd 设置的回调函数不一样哦 setHandleCallback(std::bind(&Channel::handleFun, this)); events_ |= kReadEvent; events_ |= kWriteEvent; update(); Timer *tmp = loop_->runAfter(10); //退出当前协程 get_curr_routine()->Yield(); //删除加入的 epoll 信息和对应定时器 loop_->removeChannel(this); loop_->cancel(tmp);}
事件到来会唤醒对应的协程,时间超时时 也会唤醒对应的协程(不会让其一直阻塞下去)
主事件循环还是看上面的链接即可!!
运行结果:
标签:
相关推荐:
精彩放送:
- []【当前独家】什么是执行力?执行力详情介绍
- []环球快看点丨java编程题:如何判断四个棋子连在一起?
- []何删除定时器?MyLibco协程网络库定时器的设计
- []资讯:北京:2023年计划,启动危旧楼房改建和简易楼腾退20万平方米
- []环球快播:免费下载国外视频的网站 你值得拥有
- []【聚看点】华容道有哪些通关技巧?15数字华容道解法
- []泥巴潭:《新龙族》免费卷土重来 拒绝“菜鸟玩家”
- []世界观速讯丨速读2023年北京市政府工作报告 | 2023年北京将筹建保障性租赁住房8万套,竣工各类保障性住房9万套
- []每日热讯!泸州老窖:公司销售工作按计划顺利推进
- []北京:过去5年,建设筹集各类政策性住房54万套
- []环球看点!贵州石阡 中国最古老温泉的旅游热度如何继续升温?|新春里的中国经济
- []今亮点!* 中创新航遭摩根大通减持超5%,持股比例降至1.78%
- []【焦点热闻】海南瑞泽:截至2023年1月20日,公司股东人数为66,155
- []【BT金融分析师】比亚迪电动车市场份额持续扩大,分析师称其增长超过特斯拉
- []全球视讯!白求恩大夫是哪国人?诺尔曼·白求恩资料介绍
- []全球热消息:货郎是什么意思?现在的货郎指的是什么?
- []孤城闭帝后结局怎么样?孤城闭剧情介绍
- []【世界聚看点】苹果手机怎么打开微信深色模式?苹果手机打开微信深色模式的步骤
- []陕西的简称是什么?陕西省资料介绍
- []屈原历史资料介绍?对屈原的人物评价怎么写?
- []【独家】猎狐电视剧胡军演谁?猎狐剧情介绍
- []【独家】愚人节怎么发朋友圈?愚人节适合发朋友圈的搞笑说说有哪些?
- []全球观点:华为手机nfc是什么意思?近场通信的技术原理是什么?
- []每日热点:去哪儿2023春节报告:平均每个旅客多走400公里,出境机票同比增长6.7倍
- []天天日报丨这个春节,旅游人信心又来了
- []世界最资讯丨春运返程迎来客流高峰,有人坐绿皮火车返岗开工
- []“零下53度”的东北游,能火多久?
- []简讯:租赁模式的住宿业:合作、匹配、把控
- []全球今头条!我,过年不回家,“和9个陌生人去旅游”
- []【速看料】地产律师的一年| 飞了10多个城市,为购房者追回千万损失
- []天天热推荐:地产营销人的一年| 要时刻保证自己不被淘汰,“还没想过离开房地产行业”
- []今日热门!致远新能:截止2023年1月20日股东人数为11966人
- []热资讯!物业人的一年| 经历了疫情和高温考验,“我们圆满完成年度KPI考核”
- []产业策划人的一年| 产业板块被集团地产业务拖累,“相信今年会比去年好”
- []豪宅中介的一年| 在单价屡破30万元/平的区域卖房是一种什么体验?
- []蓝盾光电:公司将严格按照信息披露的相关规定,及时履行信息披露义务
- []环球快讯:132亿!宁德时代工厂投产!
- []【环球新视野】防城港各大景区人气爆棚
- []全球今日报丨国泰君安证券:美国经济外强中干 核心GDP继续回落
- []【环球新视野】马亮:扎堆式旅游何时休?游客要理性,景区更应强化能力建设
- []总投资53亿元!20万吨负极材料项目落地
- []世界实时:【首席展望】海通证券余文心:医药板块有望反转 看好三条主线
- []244亿!特斯拉又投两工厂
- []焦点快看:白酒“霸屏”春节假期 开门红迎新增长周期 今年收益或超额
- []环球观焦点:宁德时代牵头!斥资67亿元 开发玻利维亚锂资源
- []全球热文:中海董事长颜建国拜会香港特首李家超 积极参与北部都会区和明日大屿建设
- []渣打预测布油有望反弹至90美元以上,但对突破100美元并不乐观!
- []每日视讯:现货黄金交易策略:金价见顶风险增加,关注美国PCE数据
- []文化和旅游部:春节假期国内旅游出游3.08亿人次 同比增长23.1%
- []快讯:香港财政司司长:未有定案是否再派消费券 楼市现时有秩序调整
- []美国12月新屋销售量连续第三个月上升 同比仍降26.6%
- []天天观焦点:CFTC商品持仓解读:投机者提高美国原油净多头头寸
- []新春走基层丨保障多地轨道交通正常运行,众合科技员工誓要站好春节最后一班岗
- []广西出台16条措施 加快文化旅游业全面恢复振兴
- []环球即时:1月28日财经早餐:黄金连续第六周周线上涨,焦点转向美联储
- []速读:美原油交易策略:美国GDP数据缓解需求担忧,油价将重拾涨势?
- []热门:美股异动 | 移动金融智选平台简普科技(JT.US)涨超9% 年初至今累涨超31%
- []环球快播:美股异动 | 途牛(TOUR.US)涨超9.5% 年初至今累涨近67%
- []最新资讯:威海广泰:公司以技术创新为龙头,始终重视消防救援装备的技术研发工作,每年都有10余型新产品完成开发
- []环球即时:奥维通信:具体内容请详见公司于2023年1月20日披露的《关于终止筹划重大资产重组的公告》
- []新春行业动态合集 | 日媒:春节中国旅客访日需求依旧低迷;国航回应“一航班颠簸下坠”
- []当前快报:查询车辆保险怎么查询
- []全球快消息!手工钥匙扣制作图片_手工钥匙扣制作过程
- []【世界报资讯】文化和旅游部:今年春节国内出游人次恢复至疫前同期88.6%
- []旅游强劲复苏:多地游客数追平2019年,部分已反超
- []近3.08亿人次出游,收入3758.43亿元, 春节假期各OTA数据战报PK
- []世界快看点丨上万只基金产品 2000余位基金经理 兔年养基如何选?
- []携程2023春节旅游报告:旅游订单同比增长超4倍,其中出境游增长640%
- []状态火热!欧文三分球4中3半场独砍18分
- []钠电池元年将至 产业化到哪一步了?
- []快播:特斯拉杀疯了 价格还能降?美国重磅数据公布 传递什么信号?
- []当前动态:报价上涨12%,西藏山南光伏增配储能EPC中标公示发布
- []峰谷电价差扩大,低价谷电储热采暖优势明显
- []快讯:宝马计划量产全固态电池,最快2025年实现装车
- []今日视点:重磅发声!兔年怎么投?多家公募巨头最新研判
- []环球百事通!机构展望2023:中国市场更具吸引力 多元化投资组合提供机会
- []天天热点评!盘点︱2023年即将上市IPO光伏公司统计表
- []立冬的优美诗词句子_立冬的优美诗词
- []【世界聚看点】平安福7000交了5年能退多少,保单现金价值
- []世界速递!被银行忽悠买了保险可以退吗,可以退
- []热点聚焦:公积金能不能每月还商贷,当然可以
- []全球微动态丨最低-1℃郴州未来几天将迎霜冻天气
- []【环球速看料】兔年港股开门红!恒生指数涨逾2% 科技指数大涨超4%!多板块集体爆发
- []扩张性财政政策包括哪些(扩张性货币政策包括哪些)
- []天天简讯:为什么美金汇率一直在跌(最近美元汇率为什么一直在跌 最近美元汇率为啥一直在)
- []解析基金“专业买手”!FOF基金经理为何喜欢低换手?还有哪些特征?
- []农村信用社贷款无力偿还怎么办理(农村信用社贷款10万还不上怎么办)
- []基金gp和lp的区别优先和劣后(基金gp和lp的区别优先和劣后)
- []发力定制化场景金融布局 钱小乐探索精准营销新模式
- []最低或8万/吨!硅料价格拐点何时来临?
- []当前信息:微信转账退回对方会收到提示吗?(别人微信转账给我我退回有记录吗)
- []宏观经济分析包括哪些内容(宏观经济分析包括哪些内容)
- []今日聚焦!工商宝贝成长卡好不好(工行宝贝成长卡有什么弊端)
- []农业银行怎么查询冻结原因(怎样判断是永久冻结还是临时冻结)
- []全球今亮点!公积金4万可贷款多少(公积金账户4w可以贷款多少)
- []全球今亮点!地方债谁在买(地方专项债谁来买单)
- []天天热讯:京郊民宿老板:过完最冷清的春节,盼春暖花开不愁客人
- []焦点快报!携程:兔年春节过半,香港、澳门领跑春节出境热门目的地
- []天天最资讯丨春节楼市不打烊,部分楼盘推“0月供”计划,有客户打飞的到佛山买房
- []日元计价的黄金周三创新高,美元计价的或将紧随其后!
- B站注册资本增幅400%至5亿 目前由陈睿全资持股
- 光源资本出任独家财务顾问 沐曦集成电路10亿元A轮融资宣告完成
- 巨轮智能2021年上半年营收11.24亿元 期内研发费用投入增长19.05%
- 红枣期货尾盘拉升大涨近6% 目前红枣市场总库存约30万吨
- 嘉银金科发布2021年Q2财报 期内净利润达1.27亿元同比增长208%
- 成都银行2021上半年净利33.89亿元 期内实现营收同比增长17.27亿元
- 汽车之家发布2021年第二季度业绩 期内新能源汽车品牌收入增长238%
- 中信银行上半年实现净利润290.31亿元 期末不良贷款余额706.82亿元
- 光伏概念掀起涨停潮交易价格创新高 全天成交额达1.29亿元
- 上半年生物药大增45% 关键财务指标好转营收账款持续下降
- 【全球新视野】中信证券交易手续费是多少(中信交易手续费)
- 环球观热点:明星税收怎么收费比例(明星的收入税率是多少)
- 杜邦奖学金_关于杜邦奖学金简述
- 热讯:港元1个月拆息四连跌 报2.94345
- 世界今热点:宣发“重大失误”!邓超新片紧急撤档,上映首日票房、上座率倒数第一;春节档票房已超50亿
- 环球微资讯!多家光伏逆变器上市公司2022年业绩预喜 储能正成为重要增长点
- 年终:2022跨界储能企业一览表
- 头条焦点:投资600亿!比亚迪合作伙伴造电池!
- 山东和山西为何成为储能引领者
- 消息!碳酸锂涨价?再度直逼50万大关!
- 资讯:港交所兔年首个交易日 财政司司长陈茂波冀股市吐气扬眉
- 专题回顾 | 房地产企业并购融资现状解析
- 报告:今年房企主要“保交付”,销售和投资规模呈前低后高走势
- 天天热资讯!红星美凯龙:行使换股权后 阿里巴巴持有公司权益已达到9.99%
- 盘后机构策略:市场维持强势格局 关注春节后内资流入情况
- 以岭药业:奋力推进新时代中医药传承创新发展
- 当前要闻:五矿地产(00230)首季度合约销售额30.7亿元 同比下跌30.7%
- 热讯:已签收的电子汇票在哪里查询 在哪里查询已签收的电子(已签收的电子汇票在哪里查询 在哪里查询已签收的电子)
- 当前报道:股票分红在什么时间(股票分红多长时间到账)
- 覆铜板是什么东西及用途(覆铜板是什么东西及用途)
- 环球视讯!全部资本化比率公式(全部资本化比率公式)
- 小规模纳税人收到专票的风险(小规模收到13%的专票有风险没)
- 【天天速看料】按单利计算是什么意思 什么是按单利计算(按单利计算是什么意思 什么是按单利计算)
- 热点聚焦:利润率的公式怎么算的(利润和利润率的计算公式)
- 世界今头条!春节假期海南离岛免税购物“南北两旺”
- 当前要闻:什么叫收现比(收现比是什么意思)
- 热资讯!税金贷款有什么银行做(什么银行有税金贷)
- 速看:集中趋势指标包括哪些方面(集中趋势指标包括哪些方面)
- 天天播报:大学生可以开佳物分期吗(佳物分期大学生能用吗 大学生可不可以用佳物分期)
- 央行100亿逆回购是什么意思(央行100亿逆回购意味着什么)
- 环球速读:大年初四,怎么做能接好运?
- 新资讯:货币资金包括哪三项(货币资金包括哪三个部分)
- 当前播报:强赎触发价什么意思?(强赎触发价什么意思科普)
- 当前资讯!银行卡信息不完善是怎么回事(银行提示此卡状态异常)
- 无卡是否可以存款(不带卡可以存款吗)
- 全球播报:转账二十四小时没到账怎么办(跨行转账4天了还没到账)
- 【环球时快讯】红字冲销什么意思(红字冲销什么意思)
- 2022年房贷利率是降还是升(银行利率表2022最新住房贷款利率,房贷利率每年都会变吗)
- 【速看料】林木不动产权证可以贷款吗(没有林权证可以去银行贷款吗)
- 环球时讯:广发为什么叫废行(存钱要小心五家银行)
- 天天观点:监管账户什么意思(监管账户怎么查)
- 世界简讯:来分期上征信吗2021年(来分期上征信吗2022年,上征信)
- 公积金余额只有几千块可以贷款啊(公积金只有几千块可以贷款吗 公积金余额只有几千块能贷款吗)
- 全球今头条!去银行打征信报告需要带什么资料(去银行办个人征信需准备什么材料)
- 全球速读:怎么在app申请房产退税(怎么在app里办理房贷退税)
- 瑞信:维持PACCAR(PCAR.US)中性评级
- 全球快消息!金融中bps是什么意思(bps金融专业术语)
- 分付微信怎么开通 微信分付如何开通(分付微信怎么开通 微信分付如何开通)
- 火车退票手续费 火车票退票的手续费(火车票退票要手续费吗)
- 建设银行如何提高每日转账额度(建设银行怎么提高每日转账额度 建设银行转账额度怎么提升)
- 环球热消息:炒股票新手入门基础知识(炒股入门基础知识 新手炒股基础知识)
- 每日动态!如何查询自己的征信情况(如何查自己的征信记录是否有贷款)
- 快播:NYMEX原油下看79.03美元
- 支付密码忘了怎么办(手机支付密码忘记怎么办)
- 当前快看:台湾用的货币是什么币(台湾钱币叫什么名字)
- 国际金价短线或下测1920美元
- 延期到账怎么关闭(微信延时到账怎么解除)
- 焦点日报:举牌是什么意思?(什么是举牌)
- 每日时讯!mtn是什么币(mtn是什么币)
- 2021年车险优惠政策(车险优惠政策2021 2021车险优惠)
- 春节假期过半,昆明民宿预订量同比增长731%
- 天天讯息:中国银行被冻结只能进不能出(中国银行只进不出冻结几天)
- 公积金可以更改银行卡吗(省公积金可以转市公积金吗)
- 头条焦点:车没买交强险上路会怎么样(车辆不购买交强险会怎样)
- 世界球精选!LG与韩华联手布局美国储能市场
- 天天快看点丨2023年开始,电价大改?取消阶梯电价?以后电费怎么交
- 世界今头条!电力体现时空价值,2023年能源监管工作之储能看点
- 刚办的信用卡还款日账单日怎么算(如何计算信用卡还款日和出账日)
- 全球简讯:200MW/400MWh,宁夏能发新能源宁东储能示范项目EPC招标
- 当前头条:黄金交易提醒:市场目光转向美国GDP数据,金价仍有上行机会
- 环球百事通!现货黄金交易策略:美国GDP数据前部分多头获利了结,金价短线回调
- 全球播报:美原油交易策略:经济衰退担忧回升,油价短线下行风险增加
- 环球视点!以岭药业创新专利中药惠及海内外
- 金价创十年来最佳开年表现,接近技术牛市
- 天天时讯:巴克莱预测英银2月决议鹰派,建议提前抛售欧元兑英镑!
- 世界快消息!启程2023丨房地产行业如何面对新的一年?圈里圈外许下新年愿景
- 天天百事通!安本股票部研究与投资流程主管安德鲁·米林顿:股市有温和上行潜力,2023年可能是“优质股”之年
- 环球观察:中国动力电池产能占全球的比例有多大?
- 一美元等于几元 一美元是多少人民币(一美元等于几元 一美元是多少人民币)
- 网商贷怎么借钱 网商贷如何借钱(网商贷借钱操作流程)
- 热讯:2021上海gdp总量(全国gdp排名2021最新排名,上海市gdp超4万亿)
- 资讯:什么是汇率? 什么叫汇率(什么是汇率? 什么叫汇率)
- 特隆美储能20MW/100MWh阿里中广核储能电站项目成功并网
- 龙头增速超40倍!全球储能锂电池出货量再创新高
- 发挥智能路由功能 钱小乐助力金融端与流量端精准对接
- erc20是什么币(erc是什么币)
- 全球快资讯丨等额本息 30年提前还款技巧(等额本金20年第几年提前还款合适)
- 银行反馈此卡不可用怎么解决(银行卡反馈此卡不可用怎么办 银行反馈此卡不可用是怎么回事)
- 支付宝手续费 支付宝的手续费要多少(支付宝手续费 支付宝的手续费要多少)
- 短讯!95511怎么转人工(95511怎么转人工服务)
- 热点评!集合竞价挂单撤单规则,有以下3项(集合竞价挂单撤单规则,有以下3项)
- 世界热头条丨办信用卡被拒了多久才能再申请(信用卡被拒多久可以重新申请 信用卡被拒什么时候可以)
- 天天最资讯丨基金转换是按当天的净值买入吗(基金转换是按当天的净值买入吗)
- 天天消息!2020年成都查征信网点地址(成都自动查询征信网点)
- 当前信息:股票复权有什么影响?(股票里后复权是什么意思)
- 新春佳节际 年味至浓时 看湖南市场监管人忙碌的身影......
- 【天天热闻】公募密集调仓 重点加仓五大板块!今年基金投资思路在这里
- 【天天新要闻】法币怎么换成人民币(法币怎么换成人民币)
- 视讯!在途余额是什么意思(在途余额是什么意思啊)
- 医疗保险怎么报销,分以下三步计算(农村合作医疗怎样报销)