?

“多線程”編程應用三例

2021-11-24 14:56牟曉東
電腦報 2021年44期
關鍵詞:燈帶樹莓線程

牟曉東

在計算機編程中,“線程”(thread)指的是一組可以在程序中獨立執行的指令集合,它是代碼執行的最小單位。如果程序在運行過程中只有一個線程的話,那么下一個任務必須要等到上一個任務結束后才能進行,這是一種低效的“串行”流程;引入“多線程”運行機制后,就可以在主線程執行任務的同時“并行”執行其他的任務,幾乎不需要等待時間,從而極大提高程序的運行效率。值得一提的是,“多線程”與程序調用函數并不相同,因為函數的調用是“阻塞”執行方式——必須等函數正常執行結束后才會繼續執行后面的程序代碼(否則會一直處于等待中)。在此分別以Python代碼編程和樹莓派、掌控板圖形化編程為例,演示“多線程”編程的應用。

一、Python:四支“畫筆”同時作畫

在Spyder編輯器中新建“Python多線程畫圖.py”文件,首先通過“import turtle”和“from threading import Thread”將海龜庫模塊和線程庫模塊導入;接著,設置好“畫布”的大小為800×600像素:“turtle.screensize(800,600)”,并且通過turtle模塊的Turtle()函數建立t1-t4四個Turtle對象;然后自定義四個畫圖函數,以my_draw1(a)為例:

傳入的參數a控制循環的次序:“for i in range(a):”,循環體只包括“t1.forward(2)”和“t1.left(1)”兩行代碼,作用是控制t1(Turtle對象)向前走兩個像素再向左轉1度。比如調用該函數時傳入的參數a值為180,則會畫一個180度的“半圓”(畫筆顏色默認為黑色)。其余的my_draw2(b)、my_draw3(c)和my_draw4(d)三個函數基本類似,只是多了一行“t2.pencolor(‘red)”設置畫筆顏色的代碼。

接下來,同時開啟四個線程,調用目標分別是四個Turtle對象的畫圖函數,傳入的參數均為360(畫360度的空心圓):“Thread(target=my_draw1,args=(360,)).start()”、“Thread(target=my_draw2,args=(360,)).start()”、“Thread(target=my_draw3,args=(360,)).start()”和“Thread(target=my_draw4,args=(360,)).start()”,特別要注意args后的參數必須是元組形式“(360,)”(逗號不能省略);最后,添加“turtle.mainloop()”無限循環方式處理事件語句。

程序代碼保存后運行測試,在彈出的“Python Turtle Graphics”窗口中出現了四個小箭頭,同時分別朝著設定的方向運動,最終畫出了四個顏色相異的“內切”和“外切”圓(如圖1)。

二、樹莓派:三色燈帶不同步閃爍

首先,將一條可編程ws281x燈帶通過古德微擴展板的18號引腳與樹莓派連接;接著,登錄古德微機器人網站進入“積木”編程區進行圖形化編程。

在主程序中對燈帶先進行初始化,然后順序添加三個子線程,名稱為“燈帶紅色”、“燈帶綠色”和“燈帶藍色”,分別對應三個同名的函數;每個函數均控制整條燈帶60個燈珠的三分之一部分,其中的“燈帶紅色”函數的功能是將1-20號燈珠先設置為發紅光,0.1秒鐘后再熄滅并持續0.1秒鐘;“燈帶綠色”函數的功能是將21-40號燈珠先設置為發綠光,0.2秒鐘后再熄滅并持續0.2秒鐘;而“燈帶藍色”函數的功能則是將剩下的41-60號燈珠先設置為發藍光,0.4秒鐘后再熄滅并持續0.4秒鐘(如圖2)。

如果主程序不是采用“多線程”而是函數的直接調用方式,其運行效果就會是在1-20號燈珠閃爍紅光的0.2秒鐘(兩個0.1秒鐘)周期內,其余的40個燈珠是全熄滅狀態;接下來,在21-40號燈珠閃爍綠光的0.4秒鐘周期內,前20個和后20個燈珠同樣是全熄滅狀態;最后,在41-60號燈珠閃爍藍光的0.8秒鐘周期內,前40個燈珠也是處于全熄滅狀態的。

使用“多線程”編程的話,會有什么樣的展示效果呢?將程序保存后再點擊“運行”按鈕,出現了三組燈珠互不干擾地以各自的頻率進行不同步閃爍的效果,而不是函數式的阻塞等待的執行方式。

三、掌控板:LED變色燈音樂節拍器

運行Mind+,先點擊左下角的“擴展”按鈕,將掌控板和“功能模塊”中的“多線程”添加至主界面;返回后,在“ESP32主程序”下的“循環執行”結構中添加啟動三個子線程,其中的“子線程1”只有一行“播放音樂”語句,并且其重復模式為“無限循環”,音樂可自行選擇Mind+內置的曲目(比如PRELUDE);“子線程2”實現的功能是控制OLED顯示屏根據聲音傳感器的檢測數據實時輸出多個柱狀音量的動態波形圖,包括設置線條的寬度和兩個坐標軸數據的繪制,特別需要注意的是,將“讀取麥克風聲音強度”數據進行映射運算——從0-4095映射為從50-0,并且需要添加“清屏”語句模塊(“屏幕顯示為‘全黑”);“子線程3”實現的功能是控制三支LED燈進行有規律的變色閃爍,發光顏色的隨機變化是由三個“在0和255之間取隨機數”的RGB值來動態實現的,兩個“等待0.2秒”的語句模擬控制的是LED燈的閃爍頻率,可根據所選曲目節奏的快慢來多次調試。

將程序保存為“多線程節拍.sb3”,然后連接好掌控板,再點擊“上傳到設備”按鈕進行程序的測試。當左下角出現“上傳成功”的提示后,掌控板開始有了“反應”:蜂鳴器循環播放程序設置好的音樂曲目,同時三支LED燈在不斷變換顏色地閃爍,而且在OLED顯示屏上有柱狀音量動態波形圖在不停地隨音樂的音量大小而跳動(如圖3)。

猜你喜歡
燈帶樹莓線程
LED COB燈帶在LED燈帶中演繹及應用
LED燈串顯示屏的設計與應用
樹莓派自定義“燈帶函數”
便攜式可收放LED燈帶
黃金水果紅樹莓
樹莓紅了 游人醉了
Java多線程產生安全問題及對策分析
采用ScheduledThreadPoolExecutor執行定時重試任務時內存溢出的分析及解決
e絡盟率先推出第三代樹莓派
年度睡姿大盤點(下)
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合