日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]用C++11綁定信號(hào)和槽,能使代碼可讀性更高,靈活性更強(qiáng) 注:connect()中可聲明連接類(lèi)型,默認(rèn)缺省為AutoConnection 點(diǎn)擊滾動(dòng)到 “連接類(lèi)型” 介紹↓ :#include#incl



用C++11綁定信號(hào)和槽,能使代碼可讀性更高,靈活性更強(qiáng)
注:connect()中可聲明連接類(lèi)型,默認(rèn)缺省為AutoConnection
點(diǎn)擊滾動(dòng)到 “連接類(lèi)型” 介紹↓







:

#include#includeclass?MyWindow?:?public?QWidget
{
????Q_OBJECT

public:

????typedef??std::functionfuc1;
????MyWindow(QWidget?*parent?=?0);
????~MyWindow();
????QPushButton?*??btn;
????QLabel*?label;??QVBoxLayout*?Vbox;?
????QGridLayout*?grid;
????void?click2(bool?checked);
????void?set(QString?s);


public?slots:
????void?On_TestBtn_Cliked();
????void?set2(QString?s);


};
MyWindow::MyWindow(QWidget?*parent)
????:?QWidget(parent)
{



????label?=?new?QLabel(QStringLiteral("你好"));?
????btn??=?new?QPushButton("Test");?

????grid?=?new?QGridLayout();?
????grid->addWidget(btn,0,0);

????Vbox?=?new?QVBoxLayout();
????Vbox->addLayout(grid);

????Vbox->addWidget(label);
????setLayout(Vbox);


????fuc1?fu?=?std::bind(&MyWindow::click2,?this,?std::placeholders::_1);
????connect(btn,?&QPushButton::clicked,?this,?fu);


}

MyWindow::~MyWindow()
{

}

void?MyWindow::set(QString?s)
{
????qDebug()?<<"set:"<<?QThread::currentThreadId();
????label->setText(s);
}
void?MyWindow::set2(QString?s)
{
????qDebug()?<<?"set:"?<<?QThread::currentThreadId();
????label->setText(s);
}
void?MyWindow::click2(bool?checked)
{
????qDebug()?<<?"clcik2:"<start();
}
void?MyWindow::On_TestBtn_Cliked()
{

????qDebug()?<<?"click";
}

線程:

#pragma?once
#include#includeclass?MyThread?:
????public?QThread
{
????Q_OBJECT
public:
????QObject*??window;
????void?run();
????MyThread(QObject*?parent=NULL);

????~MyThread();
signals:
????void??print(QString);
};
#include?"MyThread.h"
#include?"MainWindow.h"

MyThread::MyThread(QObject*?parent):QThread(parent)
{
????window?=?parent;
????MyWindow*??w?=?(MyWindow*)parent;?
?std::functionfu?=?std::bind(&MyWindow::set,?w,?std::placeholders::_1);
????connect(this,?&MyThread::print,?w,fu);?
}


MyThread::~MyThread()
{
}


void??MyThread::run()
{
????qDebug()?<<?"Thread?Begin";
????int?cout?=?0;
????while?(true)
????{
????????qDebug()?<<?"MyThread::run:"?<<?QThread::currentThreadId();
????????emit?print(QString::number(cout));
????????Sleep(1);
????????cout++;
????}
}

可以看到,print綁定的線程id和主線程相同,為線程安全

????connect(this,?&MyThread::print,?w,?[=](QString?s)?{

????????w->set(s);
????????qDebug()?<<?"connet?fuc:"?<<?s?<<?"?"?<<?QThread::currentThreadId();
????????//此時(shí)?線程id為主線程,可隨意調(diào)用主線程對(duì)象的界面操作
????});














void??MyThread::run()
{
????qDebug()?<<?"Thread?Begin";
????int?cout?=?0;
????while?(true)
????{
????????qDebug()?<<?"MyThread::run:"?<<?QThread::currentThreadId();
??????QMetaObject::invokeMethod(w,?"set2",?Q_ARG(QString,?QString::number(cout)));
????????Sleep(1);
????????cout++;
????}
}








MyThread::MyThread(QObject*?parent):QThread(parent)
{
????window?=?parent;
????MyWindow*??w?=?(MyWindow*)parent;

????connect(this,?&MyThread::print,?w,?std::bind(&QLabel::setText,?w->label?,?std::placeholders::_1));
}







connect(this,?&MyThread::print,?w->label,?[=](QString?s)
????{
????????//if(s.indexOf(xxxxx))?此處可以對(duì)字符串進(jìn)行過(guò)濾
????????qDebug()?<<?"Bind?Fuc:"?<<?QThread::currentThreadId();
????????w->label->setText(s);
????});

或者

????connect(this,?&MyThread::print,?w,?[=](QString?s)
????{
????????//if(s.indexOf(xxxxx))?此處可以對(duì)字符串進(jìn)行過(guò)濾
????????qDebug()?<<?"Bind?Fuc:"?<<?QThread::currentThreadId();
????????w->label->setText(s);
????});









QMetaObject::invokeMethod

修改界面中的槽set2為:

void?MyWindow::set2(QString?s,?int?pid)
{
????if?(pid?==(int)QThread::currentThreadId())
????{
????????qDebug()?<<?QStringLiteral("?此類(lèi)型的線程不在主線程中::"?)<<?s;
????????qDebug()?<<?"id_1:"?<<?pid?<<?"?id_2:"?<<?QThread::currentThreadId();
????}


}

線程:

void??MyThread::run()
{
????qDebug()?<<?"Thread?Begin";
????int?cout?=?0;
????int?_pid;
????while?(true)
????{
????????_pid?=?(int)QThread::currentThreadId();
????????qDebug()?<<?"MyThread::run:"?<<?_pid;
???????//?emit?print(QString::number(cout));

????????MyWindow*??w?=?(MyWindow*)window;
????????QMetaObject::invokeMethod(w,?"set2",?Qt::ConnectionType::QueuedConnection,
????????????Q_ARG(QString,?"QueuedConnection"),?Q_ARG(int,?_pid)
????????);
????????QMetaObject::invokeMethod(w,?"set2",?Qt::ConnectionType::AutoConnection,
????????????Q_ARG(QString,"AutoConnection"),?Q_ARG(int,?_pid)
????????);
????????QMetaObject::invokeMethod(w,?"set2",?Qt::ConnectionType::BlockingQueuedConnection,?
????????????Q_ARG(QString,?"BlockingQueuedConnection"),Q_ARG(int,?_pid)
????????);
????????QMetaObject::invokeMethod(w,?"set2",?Qt::ConnectionType::DirectConnection,
????????????Q_ARG(QString,?"DirectConnection"),?Q_ARG(int,?_pid)
????????);
????????QMetaObject::invokeMethod(w,?"set2",?Qt::ConnectionType::UniqueConnection,?
????????????Q_ARG(QString,?"UniqueConnection"),?Q_ARG(int,?_pid)
????????);
????????Sleep(1);
????????cout++;
????}
}

可見(jiàn),DirectConnection連接類(lèi)型的線程ID與主線程不同,與線程相同,不是線程安全,其他連接類(lèi)型暫時(shí)無(wú)法找到方法測(cè)試,有例子的朋友可以跟我交流下,謝謝








是官方說(shuō)明的連接類(lèi)型,翻譯

說(shuō)明:信號(hào):發(fā)送者 ?槽:接受者 ?信號(hào)和槽所在的線程是創(chuàng)建他們的線程,而不是調(diào)用connnet的時(shí)候所在的線程 AutoConnection

如果接收方住在線程發(fā)出信號(hào),使用Qt::DirectConnection。否則,使用Qt::QueuedConnection。連接類(lèi)型發(fā)送信號(hào)時(shí)決定。
解釋:
如果接收方住在線程發(fā)出信號(hào),使用Qt::DirectConnection。否則,使用Qt::QueuedConnection。連接類(lèi)型發(fā)送信號(hào)時(shí)決定。
也就是說(shuō),自動(dòng)判斷,如果信號(hào)和槽在同一個(gè)線程,就調(diào)用Qt::DirectConnection,否則調(diào)用Qt::QueuedConnection

DirectConnection

調(diào)用插槽立即發(fā)出信號(hào)時(shí)。槽是在信號(hào)線程中執(zhí)行的。

QueuedConnection

可以理解為異步?
當(dāng)槽發(fā)送給調(diào)用接收事件循環(huán)的線程時(shí),槽在接收者的線程中執(zhí)行。
也就是說(shuō),此連接類(lèi)型,只管把信號(hào)發(fā)送到槽所在的線程事件中,不會(huì)等待槽所在的線程事件處理完畢
,槽所在線程事件循環(huán)當(dāng)處理到此信號(hào)時(shí),才會(huì)執(zhí)行相應(yīng)操作

BlockingQueuedConnection

可以理解為同步,阻塞當(dāng)前線程直到同步?
當(dāng)槽發(fā)送給調(diào)用接收事件循環(huán)的線程時(shí),槽在接收者的線程中執(zhí)行。
也就是說(shuō),此連接類(lèi)型,不但把信號(hào)發(fā)送到槽所在的線程事件中,而且會(huì)等待槽所在的線程事件處理完畢
,槽所在線程事件循環(huán)當(dāng)處理到此信號(hào)時(shí),才會(huì)執(zhí)行相應(yīng)操作,信號(hào)所在的線程才會(huì)繼續(xù)下一行代碼

UniqueConnection

資料太少,不知道此類(lèi)型的大概用途。。。
這是一個(gè)標(biāo)志,可以結(jié)合上述任何一個(gè)連接類(lèi)型,使用逐位或。當(dāng)Qt:UniqueConnection,QObject:connect()將會(huì)失敗如果連接已經(jīng)存在(即如果相同的信號(hào)已經(jīng)連接到同一個(gè)槽同一雙對(duì)象)。這個(gè)標(biāo)志是在Qt 4.6中引入的。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉