2017-01-30 70 views
0

開始我用覆盆子PI3,蟒蛇2.7和OpenCV3Occurence暫時停止線程的,當其他線程Raspbian

我有兩個功能:

  1. Func1()運行Picamera

  2. Func2()將電機向前移動

我的問題是:當我運行Func2()Func1()暫停,直到Func2()完成,儘管我爲每個函數使用了單獨的線程。

我的代碼是:

def picam(): 

    t1=threading.thread(target=Func1()) 
    t1.start() 
    t1.join() 

def move(): 
    t2=threading.thread(target=Func2()) 
    t2.start() 
    t2.join() 
在我的GUI

我有2個按鈕。一個叫picam()和其他調用move()

是什麼問題?我不需要暫時停止Func1(),因爲相機也會暫時停止。

enter image description here

+0

你知道'thread.join()'是做什麼的嗎? –

+1

我會盡快回復我以前的評論... –

+0

我嘗試刪除連接(),但沒有任何變化 – mark

回答

0

我提供這個答案,因爲線程是真正讓人頭疼的話題。問題的一部分,特別是對於初學者來說,是Catch 22的不透明術語,如果你不瞭解它,就很難理解不同組件的作用。

你的問題是你如何使用joinjoin是一種等待給定線程完成的方法。所以打電話t1.start()緊跟着t1.join()使主線程等待t1完成。

除了已經開始的幾個單獨的線程的事實,你的代碼是幾乎完全等同於在主線程做

Func1() 
Func2() 

你應該把join小號兩個線程後開始,如果你希望它們同時運行:

t1=threading.thread(target=Func1()) 
t2=threading.thread(target=Func2()) 

t1.start() 
t2.start() 

t1.join() 
t2.join() 

這將創建兩個線程,啓動它們,然後等待,直到兩者都做。

+0

親愛的,我明白你說的話。請仔細閱讀我的問題。我不需要啓動兩個線程同時,在我的GUI(Pyqt4)中,我有2個按鈕。一個調用picam()和其他調用move()。我不能寫 t1.start() t2.start() t1.join() t2.join() – mark

+0

@mark。在這種情況下,你沒有提供足夠的信息。你上面所說的沒有一點從你寫的問題中很清楚,也沒有看到實際的功能,這將很難調試他們的行爲。 –

+0

因爲我在用戶點擊按鈕時運行包含線程的函數Picam()。並在點擊其他按鈕時移動() – mark