41.QT多線程while阻塞及pri子工程添加--Apple的學(xué)習(xí)筆記

一秋忙,前言

因?yàn)樽穭。孕菹⒘硕螘r(shí)間铭若,同時(shí)也思考了下我的小項(xiàng)目接著會(huì)像哪個(gè)方向走。現(xiàn)在我基本定義了之后要做的QT項(xiàng)目功能了递览,能想象出一個(gè)雛形叼屠,且知道應(yīng)該先添加什么功能再添加什么功能。但是我還是處于小功能的練手階段绞铃。

二镜雨,需求

  1. client實(shí)現(xiàn)socket時(shí)時(shí)通信線程和2ms task線程。
  2. server端也一樣儿捧。
  3. 為了文件夾架構(gòu)漂亮冷离,便于移植。需要將獨(dú)立的功能模塊設(shè)計(jì)為pri子工程纯命。

三,遇到的問題

1. pri子工程和我之前多工程有什么區(qū)別痹栖?
答:37.QT多工程項(xiàng)目建立方法--Apple的學(xué)習(xí)筆記亿汞,里面描述的等于主工程調(diào)用子工程的dll,子工程是可以獨(dú)立編譯的揪阿,文件夾內(nèi)是pro疗我。而pri子工程無法獨(dú)立編譯咆畏,其實(shí)是文件夾的意思。pro中添加include (./udsServer/udsServer.pri)吴裤。pri文件的添加就是一個(gè)txt文件修改后綴名后將文件導(dǎo)入pro工程旧找。或者說重新打開pro工程即可識(shí)別麦牺。
2. 線程如何安全的退出钮蛛?
答:一種方法是主線程調(diào)用線程對(duì)象的wait函數(shù),然后線程內(nèi)部調(diào)用自己quit剖膳。另外一種方法是在主線程中創(chuàng)建線程魏颓,然后將類moveToThread。主線程銷毀它也跟著銷毀了吱晒。
3. plantText如何顯示大寫甸饱?
答:str.toUpper。ui->textEdit->append(MsgInfo.toUpper());仑濒。
4. 為Qlist的數(shù)組賦值跑飛叹话?
答:不能直接data[0]=1,而要data.append(1)墩瞳。因?yàn)樗鼪]有分配空間驼壶。
5. 線程中添加while(1)后會(huì)阻塞信號(hào)觸發(fā)
答:網(wǎng)上搜索了下QT信號(hào)連接有5種方式,其中直接連接可以不被阻塞矗烛,但是不安全辅柴。需要添加QCoreApplication::processEvents();這樣可以專門來處理信號(hào),但是我while(1)中有msleep所以信號(hào)處理不是時(shí)時(shí)的瞭吃,由于我是2ms發(fā)一幀碌嘀,所以可以用這樣的方法。其實(shí)我目的是仿真ECU的2ms_task歪架。其實(shí)也可以用timer的timeout股冗,只是我想使用下事件循環(huán)的設(shè)計(jì),通過while循環(huán)掃描各種事件后處理的思路和蚪。

void udsServer::run()
{
    initTask();
    while (m_taskRunning) {
        //Sleep(2);
        QThread::msleep(2);
        Task_2ms();
        if(m_bSendevent==TRUE)
        {
            emit sendResponseFrame_sig(sendFrame);
            m_bSendevent = FALSE;
        }
        QCoreApplication::processEvents();
    }
    m_pThread->quit();
}

6. c++如何和c函數(shù)交互
答:函數(shù)打包到extern "C" { xx函數(shù)}即可止状。然后c就可以調(diào)用c++,c++也可以調(diào)用c攒霹。然后被c函數(shù)調(diào)用的函數(shù)中傳遞全局變量比較簡(jiǎn)單怯疤,我當(dāng)前是這樣設(shè)計(jì)的。當(dāng)然也可以傳遞全局定義的c++對(duì)象催束,然后調(diào)用此c++對(duì)象的方法集峦。應(yīng)該還能使用c++的靜態(tài)方法,之后可以嘗試下。

#ifdef __cplusplus
extern "C" {
#endif
extern xxC語言中的函數(shù)
#ifdef __cplusplus
}
extern "C" {
bool c++中的函數(shù)
}

7. 關(guān)于int轉(zhuǎn)16進(jìn)行且補(bǔ)0的方法?
答:QString("%1").arg(msg.CANData[1], 2, 16, QChar('0'))其中2就是填充2個(gè)字節(jié)塔淤,填充的內(nèi)容就是0摘昌,至于轉(zhuǎn)16進(jìn)制就是里面的16。

void Widget::showTxMsg(CANMsg &msg)
{
    QString MsgData = QString("%1").arg(msg.CANData[0], 2, 16, QChar('0'))+" "+
            QString("%1").arg(msg.CANData[1], 2, 16, QChar('0'))+" "+
            QString("%1").arg(msg.CANData[2], 2, 16, QChar('0'))+" "+
            QString("%1").arg(msg.CANData[3], 2, 16, QChar('0'))+" "+
            QString("%1").arg(msg.CANData[4], 2, 16, QChar('0'))+" "+
            QString("%1").arg(msg.CANData[5], 2, 16, QChar('0'))+" "+
            QString("%1").arg(msg.CANData[6], 2, 16, QChar('0'))+" "+
            QString("%1").arg(msg.CANData[7], 2, 16, QChar('0'));
    QString MsgInfo = QString("TX-id:%1,dlc:%2,data:%3,Type:%4").arg(QString::number(msg.MsgId,16)) \
            .arg(msg.DLC) \
            .arg(MsgData) \
            .arg(msg.MsgType) ;
    ui->textEdit->append(MsgInfo.toUpper());
}

四高蜂,效果

client通過timeout每隔3秒嘗試連接服務(wù)器聪黎,直到連接到服務(wù)器。服務(wù)器是仿真ECU备恤,而client可以理解為平時(shí)使用的canoe上位機(jī)稿饰。ECU接收uds請(qǐng)求72A后發(fā)送78A CAN報(bào)文進(jìn)行回復(fù)。uds就是ECU固件中的c代碼我移植到了Sever中仿真ECU烘跺,讓其通過以太網(wǎng)通信湘纵,好玩吧~


image.png

五,小結(jié)

沒想到這小小的多線程socket通信功能弄了我4個(gè)晚上滤淳,主要是線程重構(gòu)及改成pri子工程的設(shè)計(jì)把時(shí)間拉長(zhǎng)了梧喷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脖咐,隨后出現(xiàn)的幾起案子铺敌,更是在濱河造成了極大的恐慌,老刑警劉巖屁擅,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偿凭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡派歌,警方通過查閱死者的電腦和手機(jī)弯囊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胶果,“玉大人匾嘱,你說我怎么就攤上這事≡缈伲” “怎么了霎烙?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蕊连。 經(jīng)常有香客問我悬垃,道長(zhǎng),這世上最難降的妖魔是什么甘苍? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任尝蠕,我火速辦了婚禮,結(jié)果婚禮上载庭,老公的妹妹穿的比我還像新娘看彼。我一直安慰自己扇谣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布闲昭。 她就那樣靜靜地躺著,像睡著了一般靡挥。 火紅的嫁衣襯著肌膚如雪序矩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天跋破,我揣著相機(jī)與錄音簸淀,去河邊找鬼。 笑死毒返,一個(gè)胖子當(dāng)著我的面吹牛租幕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拧簸,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼劲绪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了盆赤?” 一聲冷哼從身側(cè)響起贾富,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牺六,沒想到半個(gè)月后颤枪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淑际,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年畏纲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片春缕。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盗胀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淡溯,到底是詐尸還是另有隱情读整,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布咱娶,位于F島的核電站米间,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膘侮。R本人自食惡果不足惜屈糊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琼了。 院中可真熱鬧逻锐,春花似錦夫晌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盏档,卻和暖如春凶掰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜈亩。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工懦窘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稚配。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓畅涂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親道川。 傳聞我的和親對(duì)象是個(gè)殘疾皇子午衰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容