何刪除定時器?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年成都查征信網點地址(成都自動查詢征信網點)
- 當前信息:股票復權有什么影響?(股票里后復權是什么意思)
- 新春佳節際 年味至濃時 看湖南市場監管人忙碌的身影......
- 【天天熱聞】公募密集調倉 重點加倉五大板塊!今年基金投資思路在這里
- 【天天新要聞】法幣怎么換成人民幣(法幣怎么換成人民幣)
- 視訊!在途余額是什么意思(在途余額是什么意思啊)
- 醫療保險怎么報銷,分以下三步計算(農村合作醫療怎樣報銷)