日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的类加多线程代码修炼

發布時間:2023/12/10 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的类加多线程代码修炼 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景:現在在做一個目標跟蹤的項目,需要實時的從工業相機中獲取圖像,然后再跟蹤圖像上的目標物,由于起初為了測試跟蹤算法,就把“從相機獲取圖像”和“跟蹤處理”都放在了主線程中,在實際測試時,直接從相機獲取圖像時,跟蹤處理部分幀率出現周期性卡頓的問題,而直接讀取本地的視頻數據時跟蹤部分幀率很穩。因為“獲取圖像”和“跟蹤處理”在一個線程中,所以兩者是一條線上的螞蚱,要快都快,要慢都滿,所以我沒必要在幀率測試上花時間了,另外考慮到,相機應該單獨出來,一個是將一些相機的操作封裝到一個類里面,另外需要將他放在一個線程中去,這樣這個線程只顧獲取圖像就可以不受其他操作的影響。又考慮到以后還會有數據處理這一塊,所以把跟蹤這塊也封裝到一個類中,也放在一個單獨的線程中去。

說自己是C++程序猿真是慚愧,使用C++也快5年了,期間也專門拿兩個月專門來學習C++語法,但是一直以來練習的太少,導致現在的水平依然很低,今天問我老同事相關問題,他直接給我發了一個“頭上頂著菜葉子的狗”,名副其實呀,我感覺我就是個菜狗,哈哈,我要盡早擺脫這個稱號。

雖然我的C++功底不深厚,但是還是有一些基礎和經驗的,我知道第一步需要做的就是把架子搭建起來,然后通過了,然后再往里面填東西。

獲取圖像的類 CaptureThread.h

#ifndef CAPTURETHREAD_H #define CAPTURETHREAD_H namespace FDSST { class CaptureThread { public:CaptureThread();~CaptureThread();void Run();void Stream();void Pause();void Stop();bool quit; private:bool pause_status; }; } #endif // CAPTURETHREAD_H

獲取圖像類實現:CaptureThread.cpp

#include <iostream> #include "../include/capturethread.h" #include <windows.h>namespace FDSST { CaptureThread::CaptureThread() {pause_status = false;quit = false; } CaptureThread::~CaptureThread() { } void CaptureThread::Run() {std::cout << "capture_thread!!!" << std::endl;return; } void CaptureThread::Stream() {pause_status = false; }void CaptureThread::Pause() {pause_status = true; }void CaptureThread::Stop() {pause_status = true;quit = true; } }

跟蹤類:TrackingThread.h

#ifndef TRACKINGTHREAD_H #define TRACKINGTHREAD_Hnamespace FDSST { class Tracking { public:Tracking();~Tracking();void Run(); }; } #endif

跟蹤類實現:TrackingThread.cpp

#include <iostream> #include "../include/trackingthread.h" #include <windows.h> namespace FDSST {Tracking::Tracking(){}Tracking::~Tracking(){}void Tracking::Run(){std::cout << "tracking_thread!!!" << std::endl;return;} }

我學著orb-slam代碼結構的樣子,整出來一個System類:System.h

#ifndef SYSTEM_H #define SYSTEM_H #include <thread> #include "../include/Trackingthread.h" #include "../include/capturethread.h" namespace FDSST { class Tracking; class CaptureThread;class System { public:System();~System(); private:Tracking* mpTracker;CaptureThread* mpCapturer;std::thread* mptTracking;std::thread* mptCapturing; }; } #endif

Syetem.cpp

在System類的構造函數中,創建兩個線程,將CaptureThread類和Tracking類中的成員函數Run作為線程的入口

#include "../include/System.h" #include <thread>namespace FDSST {System::System(){mpCapturer = new CaptureThread();mptCapturing = new std::thread(&FDSST::CaptureThread::Run, mpCapturer);std::cout << "Capture thread has been created" << std::endl;mpTracker = new Tracking();mptTracking = new std::thread(&FDSST::Tracking::Run, mpTracker);std::cout << "Tracking thread has been created" << std::endl;}System::~System(){} }

我們想象的多線程的樣子都是,代碼執行起來之后,兩個線程中代碼段一直在執行,直到到達代碼控制它結束的時候。看我在主函數中是怎么調用System的構造函數,從而創建兩個線程的。

我最初的寫法是這樣的:

#include <iostream> #include "../include/System.h" #include <windows.h>int main(int argc, char** argv) {FDSST::System TRACK();return 0; }

此時代碼可以編譯通過,但是我發現程序并沒有進入到System類中的構造函數中去,所以線程被創建的打印未輸出。我很納悶,為啥那塊代碼沒有被執行呢?

我就去請教我的老同事,一個很低調很牛的boy,我把主函數和System.cpp的內容截圖發給他,他一看就知道了,他讓我把FDSST::System TRACK();中的括號去掉,原因是,我在System.cpp中的默認構造函數中執行創建線程的操作,而如果我的TRACK后面帶有括號,就不會調用默認構造函數,我這種寫法在某些編譯器上應該會出錯的。

也就是說,
?? ?如果我使用的是默認的構造函數那么就得這樣定義 :FDSST::System TRACK;
?? ?如果我定義了帶參數的構造函數,那就可以定義為:FDSST::System TRACK(paras);

上面的問題解決之后,CaptureThread和TrackingThread類中Run函數中的打操作只被執行了一次,我就又納悶了,咋跟我想象的不一樣,應該一直執行下去,我繼續問我那個老同事事,他說需要加上while(1),我知道了是在Run函數里面加while(1).上面的Run函數改成下面這種寫法。

void CaptureThread::Run() {while (1){std::cout << "capture_thread!!!" << std::endl;}return; } void Tracking::Run() {while (1){std::cout << "tracking_thread!!!" << std::endl;}return; }

然后我發現Run函數中的打印操作還是只執行了一次,我又納悶了,又問我那老同事,他說,"你的主函數結束了吧”,讓我在main函數中添加Sleep()函數。我把主函數改成下面這個樣子

#include <iostream> #include "../include/System.h" #include <windows.h>int main(int argc, char** argv) {FDSST::System TRACK();Sleep(10000);return 0; }

修改之后,代碼可以一直執行了,但是我發現,兩個線程的輸出呈現交替執行的現象,一個線程執行很多次,然后另外一個線程再執行很多次,交替執行,像下面這樣。

?我又問我老同事,他讓我在每一個Run函數中也加上Sleep(),我就把Run函數中加上Sleep()

void CaptureThread::Run() {while (1){std::cout << "capture_thread!!!" << std::endl;Sleep(2);}return; } void Tracking::Run() {while (1){std::cout << "tracking_thread!!!" << std::endl;Sleep(2);}return; }

這下再執行:就正常了,接下來就可以往里面實現功能了。雖然這個框架很簡單,但是在搭建出來的過程中讓我學到很多東西,所以將難得問題拆分成簡單的問題,一步一步的來,就可以解決。

總結

以上是生活随笔為你收集整理的C++中的类加多线程代码修炼的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99热这里只有精品18 | 亚洲精品电影在线 | 日本手机看片 | 国产成人无码精品久久二区三 | 免费欧美黄色片 | 欧美一级夜夜爽 | 18视频在线观看网站 | 日韩一区二区在线观看 | 最近中文字幕在线中文高清版 | 婷婷综合精品 | 日本久久网 | 在线观看免费毛片 | 色涩久久| 欧美香蕉视频 | 涩涩视频在线观看 | 日韩中文字幕一区二区三区四区 | 在线观看日本 | 青青草视频成人 | 一本一道久久综合狠狠老精东影业 | 国产成人精品亚洲精品色欲 | 99久久精品免费看国产四区 | 中文字幕23页| 国产精品久久在线 | 欧美视频一区二区在线 | 人人射人人 | 精品国产aⅴ一区二区三区东京热 | 亚洲网av| 亚洲香蕉久久 | 国产一级免费片 | 黄色网址在线免费 | 美女视屏 | 日本护士╳╳╳hd少妇 | 久久久久久久亚洲av无码 | 99这里只有精品 | 日日夜夜撸啊撸 | 亚洲天堂视频在线播放 | 国产日本视频 | 岛国av不卡 | 91久久久久久久久久久久久 | 在线观看www视频 | 中文在线永久免费观看 | 免费成人在线观看动漫 | 国内精品视频一区 | 欧美一级淫片 | 天天干天天干天天干 | 亚洲日本韩国在线 | 亚洲熟妇丰满大屁股熟妇 | 五月婷婷导航 | 尤物视频在线观看 | 国产人人射 | 精品久久免费视频 | 久久人人爽人人爽 | 国产精品欧美久久久久天天影视 | 奇米精品一区二区三区四区 | av黄色小说 | 大尺度做爰床戏呻吟舒畅 | 欧美中文字幕在线播放 | 国产成人自拍偷拍 | 久久.com| 国产亚洲自拍一区 | 精品国产18久久久久久二百 | 综合视频一区 | 亚洲第一自拍 | 欧美午夜性春猛交 | 国产露脸无套对白在线播放 | 欧美a级成人淫片免费看 | 东京热av一区 | 91av色| 一级特黄av | 视频久久精品 | 亚洲视频免费在线 | 黄色污在线观看 | 亚洲国产综合一区 | 久久涩 | 天天干天天爽天天操 | 国产日韩欧美一区二区东京热 | 亚洲综合涩 | 免费人妻精品一区二区三区 | 国产一二三在线观看 | 18成人在线 | 色综合久久久久综合体桃花网 | 国产99久久久国产精品 | 日韩成人区 | 日韩一级黄色大片 | 欧美丰满熟妇bbb久久久 | 精品国产福利 | 亚洲黄色免费 | 成人免费视频网站在线看 | 欧美丰满一区二区免费视频 | 在线播放视频高清在线观看 | 人妻在线一区 | 欧美黄色激情视频 | 婷婷九月| 免费污视频| 亚洲综合婷婷久久 | 成人综合区 | 性生活毛片| 边吃奶边添下面好爽 | 中文字幕av解说 |