中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

怎么介紹自己做的企業(yè)網(wǎng)站頁(yè)面提高網(wǎng)站收錄的方法

怎么介紹自己做的企業(yè)網(wǎng)站頁(yè)面,提高網(wǎng)站收錄的方法,web網(wǎng)站開發(fā)詳細(xì)全流程圖,有哪些做統(tǒng)計(jì)銷量的網(wǎng)站Qt使用單例模式讀取xml文件 一、單例模式介紹1、什么是單例模式2、為什么使用單例模式3、什么情況下使用單例模式4、使用單例模式需要注意哪些問題線程安全 5、單例模式的類型6、單例類的特點(diǎn) 2、單例模式的實(shí)現(xiàn)2.1懶漢式2.2餓漢式 一、單例模式介紹 1、什么是單例模式 單例模…

Qt使用單例模式讀取xml文件

  • 一、單例模式介紹
    • 1、什么是單例模式
    • 2、為什么使用單例模式
    • 3、什么情況下使用單例模式
    • 4、使用單例模式需要注意哪些問題
        • 線程安全
    • 5、單例模式的類型
    • 6、單例類的特點(diǎn)
  • 2、單例模式的實(shí)現(xiàn)
    • 2.1懶漢式
    • 2.2餓漢式

一、單例模式介紹

1、什么是單例模式

單例模式是指在整個(gè)系統(tǒng)生命周期內(nèi),保證一個(gè)類只能產(chǎn)生一個(gè)實(shí)例,確保該類的唯一性。

2、為什么使用單例模式

1、節(jié)省資源。一個(gè)類只有一個(gè)實(shí)例,不存在多份實(shí)例,節(jié)省資源。
2、方便控制。在一些操作公共資源的場(chǎng)景時(shí),避免了多個(gè)對(duì)象引起的復(fù)雜操作。

3、什么情況下使用單例模式

在程序中多次使用同一個(gè)對(duì)象且作用相同時(shí),為了防止頻繁地創(chuàng)建對(duì)象使得內(nèi)存飆升,單例模式可以讓程序僅在內(nèi)存中創(chuàng)建一個(gè)對(duì)象,讓所有需要調(diào)用的地方都共享這一單例對(duì)象。

4、使用單例模式需要注意哪些問題

線程安全
  • 什么是線程安全

在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會(huì)通過同步機(jī)制保證各個(gè)線程都可以正常且正確的執(zhí)行,不會(huì)出現(xiàn)數(shù)據(jù)污染等意外情況。

  • 如何保證線程安全

1、給共享的資源加把鎖,保證每個(gè)資源變量每時(shí)每刻至多被一個(gè)線程占用。
2、讓線程也擁有資源,不用去共享進(jìn)程中的資源。如:使用threadlocal可以為每個(gè)線程維護(hù)一個(gè)私有的本地變量。

5、單例模式的類型

  • 懶漢式

系統(tǒng)運(yùn)行中,實(shí)例并不存在,只有當(dāng)需要使用該實(shí)例時(shí),才會(huì)去創(chuàng)建并使用實(shí)例。這種方式要考慮線程安全。

  • 餓漢式

系統(tǒng)一運(yùn)行,就初始化創(chuàng)建實(shí)例,當(dāng)需要時(shí),直接調(diào)用即可。這種方式本身就線程安全,沒有多線程的線程安全問題。

6、單例類的特點(diǎn)

  • 構(gòu)造函數(shù)和析構(gòu)函數(shù)為私有類型,目的是禁止外部構(gòu)造和析構(gòu)。
  • 拷貝構(gòu)造函數(shù)和賦值構(gòu)造函數(shù)是私有類型,目的是禁止外部拷貝和賦值,確保實(shí)例的唯一性。
  • 類中有一個(gè)獲取實(shí)例的靜態(tài)方法,可以全局訪問。

2、單例模式的實(shí)現(xiàn)

2.1懶漢式

Created with Rapha?l 2.3.0 開始 使用單例對(duì)象 單例對(duì)象是否實(shí)例化? 返回單例對(duì)象 實(shí)例化單例對(duì)象 yes no

加鎖的懶漢式單例(線程安全)
頭文件:

///  加鎖的懶漢式實(shí)現(xiàn)  //class SingleInstance
{public:// 獲取單實(shí)例對(duì)象static SingleInstance *GetInstance();//釋放單實(shí)例,進(jìn)程退出時(shí)調(diào)用static void deleteInstance();//返回所有的IPQVariantList getIP(){return m_ips;}//獲取XML文件bool initalize();// 打印實(shí)例地址void Print();private:// 將其構(gòu)造和析構(gòu)成為私有的, 禁止外部構(gòu)造和析構(gòu)SingleInstance();~SingleInstance();// 將其拷貝構(gòu)造和賦值構(gòu)造成為私有函數(shù), 禁止外部拷貝和賦值SingleInstance(const SingleInstance &signal);const SingleInstance &operator=(const SingleInstance &signal);//解析xml中的內(nèi)容void parseIP(const QDomNode &root);private:// 唯一單實(shí)例對(duì)象指針static SingleInstance *m_SingleInstance;static std::mutex m_Mutex;//存儲(chǔ)IPQVariantList m_ips;
};

源文件:

//初始化靜態(tài)成員變量
SingleInstance *SingleInstance::m_SingleInstance = nullptr;
std::mutex SingleInstance::m_Mutex;// 注意:不能返回指針的引用,否則存在外部被修改的風(fēng)險(xiǎn)!
SingleInstance * SingleInstance::GetInstance()
{//  這里使用了兩個(gè) if 判斷語(yǔ)句的技術(shù)稱為雙檢鎖;好處是,只有判斷指針為空的時(shí)候才加鎖,//  避免每次調(diào)用 GetInstance的方法都加鎖,鎖的開銷畢竟還是有點(diǎn)大的。if (m_SingleInstance == nullptr) {std::unique_lock<std::mutex> lock(m_Mutex); // 加鎖if (m_SingleInstance == nullptr){volatile auto temp = new (std::nothrow) SingleInstance();m_SingleInstance = temp;}}return m_SingleInstance;
}void SingleInstance::deleteInstance()
{std::unique_lock<std::mutex> lock(m_Mutex); // 加鎖if (m_SingleInstance){delete m_SingleInstance;m_SingleInstance = nullptr;}
}bool SingleInstance::initalize()
{QString path("目錄");QFile file(path);if(file.exists()){if(file.open(QIODevice::ReadOnly | QIODevice::Truncate)){QString error;QDomDocument document;document.setContent(&file, &error);file.close();if(document.isNull()){qDebug() << QString("文件格式異常:1%").arg(error);return false;}QDomNode root = document.firstChild();parseIP(root);}else{qDebug() << QString("%1:文件不存在,:2%").arg(path).arg(file.errorString());}}else{qDebug() QString("%1:文件不存在!").arg(path);return false;}return !m_ips.isEmpty();
}void SingleInstance::Print()
{std::cout << "我的實(shí)例內(nèi)存地址是:" << this << std::endl;
}SingleInstance::SingleInstance()
{std::cout << "構(gòu)造函數(shù)" << std::endl;
}SingleInstance::~SingleInstance()
{std::cout << "析構(gòu)函數(shù)" << std::endl;deleteInstance();
}void SingleInstance::parseIP(const QDomNode &root)
{QDomNode startnode = root.nextSibling();QDomNode node = startnode.firstChild();while(!node.isNull()){QVariantMap ips;ips.clear();QDomElement element = node.toElement();ips.insert("ip", element.attribute("ip"));ips.insert("port", element.attribute("port"));ips.insert("multiip", element.attribute("multiip"));}}

main.cpp

if(Singleton::GetInstance()->initalize())
{
...
}

2.2餓漢式

頭文件

// 餓漢實(shí)現(xiàn) /class Singleton
{
public:// 獲取單實(shí)例static Singleton* GetInstance();// 釋放單實(shí)例,進(jìn)程退出時(shí)調(diào)用static void deleteInstance();//返回所有的IPQVariantList getIP(){return m_ips;}//獲取XML文件bool initalize();// 打印實(shí)例地址void Print();private:// 將其構(gòu)造和析構(gòu)成為私有的, 禁止外部構(gòu)造和析構(gòu)Singleton();~Singleton();// 將其拷貝構(gòu)造和賦值構(gòu)造成為私有函數(shù), 禁止外部拷貝和賦值Singleton(const Singleton &signal);const Singleton &operator=(const Singleton &signal);//解析xml中的內(nèi)容void parseIP(const QDomNode &root);private:// 唯一單實(shí)例對(duì)象指針static Singleton *g_pSingleton;//存儲(chǔ)IPQVariantList m_ips;
};

源文件:

// 代碼一運(yùn)行就初始化創(chuàng)建實(shí)例 ,本身就線程安全
Singleton* Singleton::g_pSingleton = new (std::nothrow) Singleton();Singleton* Singleton::GetInstance()
{return g_pSingleton;
}void Singleton::deleteInstance()
{if (g_pSingleton){delete g_pSingleton;g_pSingleton = nullptr;}
}bool SingleInstance::initalize()
{QString path("目錄");QFile file(path);if(file.exists()){if(file.open(QIODevice::ReadOnly | QIODevice::Truncate)){QString error;QDomDocument document;document.setContent(&file, &error);file.close();if(document.isNull()){qDebug() << QString("文件格式異常:1%").arg(error);return false;}QDomNode root = document.firstChild();parseIP(root);}else{qDebug() << QString("%1:文件不存在,:2%").arg(path).arg(file.errorString());}}else{qDebug() QString("%1:文件不存在!").arg(path);return false;}return !m_ips.isEmpty();
}void Singleton::Print()
{std::cout << "我的實(shí)例內(nèi)存地址是:" << this << std::endl;
}Singleton::Singleton()
{std::cout << "構(gòu)造函數(shù)" << std::endl;
}Singleton::~Singleton()
{std::cout << "析構(gòu)函數(shù)" << std::endl;deleteInstance();
}void SingleInstance::parseIP(const QDomNode &root)
{QDomNode startnode = root.nextSibling();QDomNode node = startnode.firstChild();while(!node.isNull()){QVariantMap ips;ips.clear();QDomElement element = node.toElement();ips.insert("ip", element.attribute("ip"));ips.insert("port", element.attribute("port"));ips.insert("multiip", element.attribute("multiip"));}}

main.cpp

if(Singleton::GetInstance()->initalize())
{
...
}

xml說明

<?xml version="1.0" encoding="utf-8"?>XML聲明是XML文檔的第一句
<ips>
<ip ip="xxx" port="xxx" multiip="xxx"/>
</ips>
http://www.risenshineclean.com/news/37456.html

相關(guān)文章:

  • 大型網(wǎng)站的制作seo基本步驟
  • 怎樣建個(gè)網(wǎng)站杭州千鋒教育地址
  • 培訓(xùn)網(wǎng)站建設(shè)谷歌瀏覽器 安卓下載2023版官網(wǎng)
  • 什么軟件做美食視頻網(wǎng)站學(xué)生個(gè)人網(wǎng)頁(yè)制作教程
  • html5+css3 網(wǎng)站seo刷關(guān)鍵詞排名工具
  • wordpress改造成mip站網(wǎng)站建設(shè)小程序開發(fā)
  • 北京品牌網(wǎng)站營(yíng)銷型網(wǎng)站有哪些功能
  • 上市企業(yè)網(wǎng)站設(shè)計(jì)相似圖片在線查找
  • 網(wǎng)站營(yíng)銷的重要價(jià)值百度旗下有哪些app
  • 網(wǎng)站開發(fā)論文題目足球世界排名
  • 國(guó)內(nèi)銀行網(wǎng)站做的很垃圾跨境電商seo什么意思
  • 建設(shè)外貿(mào)企業(yè)網(wǎng)站搜索引擎優(yōu)化入門
  • 網(wǎng)站跟app的區(qū)別是什么網(wǎng)站排名大全
  • ASP動(dòng)態(tài)網(wǎng)站開發(fā)案例教程競(jìng)價(jià)網(wǎng)官網(wǎng)
  • 西安網(wǎng)站開發(fā)企業(yè)網(wǎng)站的在線推廣方法有
  • 汽車網(wǎng)站更新怎么做搜狗網(wǎng)
  • 鞍山今日頭條新聞東莞seo顧問
  • 做門戶網(wǎng)站主要技術(shù)哪一塊業(yè)務(wù)推廣方式有哪些
  • 可做商業(yè)用途的圖片網(wǎng)站新開網(wǎng)店自己如何推廣
  • DW做網(wǎng)站下拉列表怎么做寧波seo怎么做推廣渠道
  • 唐山盤古做網(wǎng)站多少錢長(zhǎng)尾詞seo排名
  • 政府網(wǎng)站建設(shè)調(diào)研報(bào)告營(yíng)銷型網(wǎng)站優(yōu)化
  • 運(yùn)營(yíng)推廣的網(wǎng)站有哪些亞洲足球最新排名
  • 哪些網(wǎng)站做二手挖機(jī)微信社群營(yíng)銷推廣方案
  • 國(guó)內(nèi)互動(dòng)網(wǎng)站建設(shè)江門網(wǎng)站定制多少錢
  • 申請(qǐng)免費(fèi)網(wǎng)站建設(shè)seo排名優(yōu)化
  • 汕頭建設(shè)吧百度貼吧seo外包優(yōu)化公司
  • ecshop商城網(wǎng)站建設(shè)seo搜索優(yōu)化工具
  • 做網(wǎng)站制作需要多少錢最新國(guó)內(nèi)新聞重大事件
  • 宜賓網(wǎng)站建設(shè)費(fèi)用抖音推廣引流