Python threading 間違ってました
Tkinter で作ったGUIを別スレッドで動かす実験をしていて気付いたのですが、「バーコード端末(S0102-0)ソース」は threading の使い方が間違っているようです。
バーコード・リーダーの読み取り値によって処理を行った後で、ブザー鳴動、LED点滅などの表示動作をさせるのですが、表示動作終了を待つことなくバーコード・リーダーを読み取れるようにしたくて threading を使っています。
ところが、実際には関数を呼んだだけのような動作をしていて、バーコード・リーダー読み取り開始が遅れているようです。
要するに、タイトル画像右側のように作ったつもりが、左側の動きをしていたようです。
ブザー鳴動等の動作時間が、人の手の動作に比べて短い(0.5秒未満)ため、違和感無く使えていますが、別途動作確認の上で修正を予定します。
現状(期待した動作と異なる)記述
thread_0 = threading.Thread(target=thre(3))
thread_0.start()
この場合は、タイトル画像左側のようにスレッド処理が終わるまで、メインが止まってしまいます。
正常(当初期待した動作の)記述
thread_0 = threading.Thread(target=thre, args=(3,))
thread_0.start()
引数はargs= でタプルを渡すようです。
今回は要素が1つだけのタプルなので、括弧の中はカンマで終わります。
タイトル画像右側のようにメイン処理と並行してスレッド処理が進みます。
比較実験
タイトル画像左側の実験
コード
import threading
from time import sleep
def thre(t):
for i in range(t):
sleep(0.1)
print('Thread ' + str(i))
sleep(0.2)
print()
print('threading.Thread(target=thre(3))')
print()
for i in range(5):
sleep(0.1)
print('Main ' + str(i))
if i == 1:
thread_0 = threading.Thread(target=thre(3))
thread_0.start()
sleep(0.2)
実行結果
threading.Thread(target=thre(3))
Main 0
Main 1
Thread 0
Thread 1
Thread 2
Main 2
Main 3
Main 4
sleep(0.1), sleep(0.2) と2回に分けているのは、main と thread_0 のprint のタイミングが重ならないようにする目的です。(タイミングが近いと両方の文字列が1行に表示されてしまいます。)
タイトル画像はsleep の分も意識した図にしました。
タイトル画像右側の実験
コード
import threading
from time import sleep
def thre(t):
for i in range(t):
sleep(0.1)
print('Thread ' + str(i))
sleep(0.2)
print()
print('threading.Thread(target=thre, args=(3,))')
print()
for i in range(5):
sleep(0.1)
print('Main ' + str(i))
if i == 1:
thread_0 = threading.Thread(target=thre, args=(3,))
thread_0.start()
sleep(0.2)
実行結果
threading.Thread(target=thre, args=(3,))
Main 0
Main 1
Thread 0
Main 2
Thread 1
Main 3
Thread 2
Main 4
タイトル画像左側との違いは、threading の指定だけです。
左側: threading.Thread(target=thre(3))
右側: threading.Thread(target=thre, args=(3,))
threading は面白い
threading は、PIC18F には真似出来ない芸当で面白いです。
GUIのスレッドが終了した時にメインも終了させるにはどうしたら良いかなど、必要なところから勉強して行きたいと思います。
今後とも宜しくお願い致します。