對多執行緒僅限于定義上的了解,,目前在做一個機器人抓取傳送帶上物體的上位機,涉及到傳送帶運動、物體位姿處理、抓取位置計算、機器人控制等幾個模塊,如何用多執行緒控制幾個模塊有序運行呢?,,就是說怎么能用多執行緒做到一得到處理后的資訊,立刻計算;一計算出結果,立刻抓取;一抓取完成,立刻抓取下一個。。。類似這種功能實習,,敘述的有點多,望大神賜教,特別感激!
uj5u.com熱心網友回復:
個人建議直接用Ross把倒不是俺們說又讓你用新東西,主要是Ross可以模擬測驗。有模擬環境,總比你啥都沒有光憑嘴說要實際
uj5u.com熱心網友回復:
ROS中控制機械臂抓取目標例程https://blog.csdn.net/zzu_seu/article/details/91347757
uj5u.com熱心網友回復:
另外用Ros也是告訴你實際專案,從來就沒人跟這里一樣天天折騰所謂執行緒,以為執行緒如何如何偉大。哪怕Ros這樣的專案也是使用訊息,佇列,pipline去做隔離,而不是沒日沒夜的折騰執行緒
uj5u.com熱心網友回復:
沒接觸過ros,,然后上面提到的幾個模塊都已經完成了,用的ABB機器人,在Robotstudio中模擬仿真,,,現在是希望把幾部分整合到一起,,如果再學ros的話可能會花費更多時間,,,非常感謝您的寶貴建議!uj5u.com熱心網友回復:
不要管執行緒不執行緒,這個玩意你要一頭栽進執行緒就算進了坑了,想爬出來就----,這里已經無數次證明看見釘子就想“執行緒”錘子的,100%會進坑,100%會砸到自己的手這種東西第一步是寫context,因為你要的不是什么執行緒,而是“跟蹤執行狀態”,執行動作可以并行/并發,但核心是狀態而不是執行緒
uj5u.com熱心網友回復:
這也是Ros這種系統核心從來就沒放在執行緒上,他的核心設計是Node節點,是訊息,是dataflow資料流,是狀態機原因uj5u.com熱心網友回復:
對的,是并行
uj5u.com熱心網友回復:
既然是狀態跟蹤,你需要也是建立狀態描述物體檢查------------存在物體----判定是否已建立狀態--------如果已經建立狀態,更新運動狀態,位置資訊。如果未建立狀態,新建狀態并加入物體狀態佇列(物體狀態-等待抓取)
機器人控制------------------訂閱物體狀態佇列,沒有佇列異步等著,有佇列取到一個,進行抓取控制(更新物體控制狀態為正在抓取中),異步等待控制狀態結果(成功還是失敗)
so設計結果是
公用背景關系:
執行緒安全佇列 --- 物體佇列
當前控制物體
后臺服務:
1. 判定物體服務-------------查找物體,判定物體存在,判定物體是否為同一物體,跟蹤物體運動狀態,更新物體位置資訊
2.抓取服務------------從公用佇列獲取一個物體,設定為當前控制物體。啟動異步抓取任務,等待抓取結果,重復整個程序
uj5u.com熱心網友回復:
好噠,謝謝您,講的很詳細了,我再學習一下,謝謝(*°?°)=3
uj5u.com熱心網友回復:
雖然我沒做過上位機程式,但是看你說的,好像就是同步,有什么用執行緒的必要嗎?
uj5u.com熱心網友回復:
不是同步,我描述的只是一個整體程序,但是實際應用中各部分都在運行自己的作業,而且有個時間上的協調
uj5u.com熱心網友回復:
Rx對你或許有用https://github.com/dotnet/reactive
uj5u.com熱心網友回復:
https://www.jianshu.com/p/328a1cc5eddcuj5u.com熱心網友回復:
Rx對你或許有用
https://github.com/dotnet/reactive
uj5u.com熱心網友回復:
就是說怎么能用多執行緒做到一得到處理后的資訊,立刻計算;一計算出結果,立刻抓取;一抓取完成,立刻抓取下一個。。。類似這種功能實習,,敘述的有點多,望大神賜教,特別感激!
你寫的就是普通的方法呼叫,不外乎區分為同步方法和異步方法,而已。
uj5u.com熱心網友回復:
舉個例子來說,同步方法代碼可能是寫ResType 處理接收到的訊息(接收訊息包 data)
{
var r1 = 開始計算(data);
var res = 開始抓取(result);
return res;
}
而5、6年前的異步代碼可能是寫
void 處理接收到的訊息(接收訊息包 data, Action<ResType> callback)
{
ThreadPool.QueueUserWorkItem(h => //呼叫 .net 執行緒池自動管理一個任務(匿名委托任務)
{
var result = 開始計算(data);
ThreadPool.QueueUserWorkItem(k => //呼叫 .net 執行緒池自動管理一個任務(匿名委托任務)
{
開始抓取(result, callback); //異步任務完成,回呼通過引數傳來的 Action
});
});
}
而最近幾年的寫法是寫
async Task<ResType> 處理接收到的訊息(接收訊息包 data)
{
var result = await 開始計算(data); //呼叫 .net task 自動管理一個異步任務
return await 開始抓取(result); //呼叫 .net task 自動管理另一個異步任務
}
現在的語法簡潔了,但是異步的概念其實沒變。也就是說,你順序操作是 A->B->C,改為異步多執行緒就是使用 .net 系統的高效率的任務管理機制來呼叫 B 和 C,并且不等任務結束(甚至不等任務開始)就可以立刻回傳 A 和 B 方法。
uj5u.com熱心網友回復:
.net 本身就是一個高效率的系統框架,但是也有很多早先很多年的所謂開源框架,用復雜的代碼和學習,來實作 .net 一兩行代碼的功能。所以這個要注意,要學好 .net,把精力放到底層和高層的你們自己公司“原創”系統設計上,不要把精力放到浪費時間的培訓班常用的框架上。uj5u.com熱心網友回復:
.net 本身就是一個高效率的系統框架,但是也有很多早先很多年的所謂開源框架,用復雜的代碼和學習,來實作 .net 一兩行代碼的功能。所以這個要注意,要學好 .net,把精力放到底層和高層的你們自己公司“原創”系統設計上,不要把精力放到浪費時間的培訓班常用的框架上。
我好像理解了,太感謝您了,代碼易懂,,我正在看一本《C#多執行緒開發之并發編程》,正好看到await,,之前從沒用過并發,又打開了一塊新大陸,,謝謝您耐心的回復
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/19450.html
標籤:C#
上一篇:最流行最漂亮的CascadiaCode 、FiraCode 與 OPPOSans混合的字體
下一篇:在線等,關于代理的問題。
