国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

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

怎么介紹自己做的企業(yè)網(wǎng)站頁(yè)面萬(wàn)能搜索引擎入口

怎么介紹自己做的企業(yè)網(wǎng)站頁(yè)面,萬(wàn)能搜索引擎入口,做網(wǎng)站需要什么開發(fā)語(yǔ)言,萊蕪民生廣角Qt使用單例模式讀取xml文件 一、單例模式介紹1、什么是單例模式2、為什么使用單例模式3、什么情況下使用單例模式4、使用單例模式需要注意哪些問題線程安全 5、單例模式的類型6、單例類的特點(diǎn) 2、單例模式的實(shí)現(xiàn)2.1懶漢式2.2餓漢式 一、單例模式介紹 1、什么是單例模式 單例?!?article class="baidu_pl">

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://aloenet.com.cn/news/47662.html

相關(guān)文章:

  • 織夢(mèng)發(fā)布文章wordpressseo優(yōu)化軟件哪個(gè)好
  • 翻墻國(guó)外網(wǎng)站做兼職網(wǎng)站優(yōu)化公司開始上班了
  • 廣州聯(lián)享網(wǎng)站建設(shè)公司怎么樣新聞熱點(diǎn)
  • 廣東炒股配資網(wǎng)站開發(fā)百度關(guān)鍵詞優(yōu)化推廣
  • 鄭州網(wǎng)站建設(shè)老牌公司谷歌搜索引擎鏡像入口
  • 網(wǎng)站建設(shè)源碼是什么濟(jì)南網(wǎng)站優(yōu)化
  • 網(wǎng)站開發(fā) 定制 多少 錢seo顧問賺錢嗎
  • 中國(guó)做美國(guó)酒店的網(wǎng)站好百度指數(shù)官網(wǎng)首頁(yè)
  • 求做網(wǎng)站的百度統(tǒng)計(jì)怎么用
  • ??谥悄芙ㄕ驹斍榫W(wǎng)站外鏈怎么發(fā)布
  • 合肥網(wǎng)站建設(shè)網(wǎng)站模板如何推廣店鋪呢
  • 長(zhǎng)春做個(gè)人網(wǎng)站做不了超級(jí)軟文
  • 美女做那種視頻網(wǎng)站怎么在百度制作自己的網(wǎng)站
  • 婚紗攝影網(wǎng)站設(shè)計(jì)百度應(yīng)用市場(chǎng)app下載安裝
  • 織夢(mèng)怎么做雙語(yǔ)網(wǎng)站中山口碑seo推廣
  • 有什么網(wǎng)站可以做婚慶視頻新聞今天的最新新聞
  • 如何選擇南京網(wǎng)站建設(shè)橙子建站
  • 家具網(wǎng)站怎么做aso網(wǎng)站
  • 做h5的免費(fèi)軟件提升seo排名平臺(tái)
  • 網(wǎng)站建設(shè)的開發(fā)方式外貿(mào)網(wǎng)站優(yōu)化推廣
  • 大連做網(wǎng)站的公司有哪些網(wǎng)上教育培訓(xùn)機(jī)構(gòu)排名
  • 廣漢網(wǎng)站建設(shè)2022年最新最有效的營(yíng)銷模式
  • 壽光專業(yè)做網(wǎng)站網(wǎng)絡(luò)營(yíng)銷推廣策略有哪些
  • 山東網(wǎng)站建設(shè).com關(guān)鍵詞挖掘查詢工具愛站網(wǎng)
  • 上百度推廣 免費(fèi)做網(wǎng)站泰安百度公司代理商
  • 房租 做網(wǎng)站百度網(wǎng)頁(yè)版鏈接
  • 建設(shè)綜合購(gòu)物網(wǎng)站建站abc
  • 視頻網(wǎng)站建設(shè) 方案網(wǎng)絡(luò)營(yíng)銷的類型
  • 優(yōu)化對(duì)網(wǎng)站真的非常有用嗎廣告聯(lián)盟怎么加入
  • 東營(yíng)建設(shè)信息網(wǎng)老網(wǎng)站深圳百度地圖