2017-11-07 110 views
0

スレッドをforループで順番に開始したいのですが、次のスレッドは現在のスレッドが完了するまで開始しないでください。この問題で私を助けてください。forループでPythonで順番にスレッドを開始するには?

私はGUIを持っているので、これを達成したいと思いますし、各ループごとにプログレスバーが表示されて実行され、GUIはロックされません(醜い "応答なし"エラーになりません)

for op in ["op1", "op2"]: 
    start_thread() 

def start_thread(): 
    display_and_run_progress_bar() 
    do_the_operation() 
    when_op_is_completed_destroy_progress_bar() 
+0

新しいものを開始する前に完了するのを待っているのであれば、実際にはマルチスレッドではありませんか? –

+0

@ Ev.Kounisはい、それは非常に簡単です。私はサンプルコード – alwbtc

+0

@Matを提供する時間がありませんので、GUIをロックしません。 – alwbtc

答えて

2

各操作を独自のスレッドで実行するには、一度に1つのみを実行するには、各スレッドを起動した後にjoinにする必要があります。 joinは、スレッドが完了するまで待機してから続行するようにメインプロセスに指示します。あなたの擬似コードのスタイルで行く:

for op in ["op1", "op2"]: 
    thread = start_thread(op) 
    thread.join() 

をあなたがそれを使用するもの、スレッドライブラリに応じて少し異なることが、たとえばhttps://docs.python.org/2/library/threading.html#threading.Thread.joinのために表示されます。

メインスレッドで上記のコードを実行しても、それでもGUIはロックされます。これで、すべてのOPSのオフだ単一スレッドで実行されている

thread = threading.Thread(target=do_ops, args=[["op1", "op2"]]) 
thread.start() 

def do_ops(ops): 
    for op in ops: 
     display_and_run_progress_bar() 
     do_the_operation() 
     when_op_is_completed_destroy_progress_bar() 

:私は何を示唆することはそうのように、各オペアンプのための新しいスレッドを作成するのではなく、いずれかによって、それぞれのOP 1を行い、単一のスレッドを作成されていませんGUIをロックしないようにメインプロセス。

+0

問題は、コードはMySQLコネクタを使用してデータベースに接続し、データベースから読み取ります。すべてのスレッドが同時に実行されると、同じコネクタが使用され、 'OperationalError:(2013、 'クエリ中にMySQLサーバーとの接続が失われました)'というエラーが表示されます。 – alwbtc

+0

OKですが、ここで私の答えでは、 'thread.join()'はスレッドが完了するまでハングするため、一度に1つのスレッドしか実行していないと思います。もちろん、 'start_thread'がこれを動作させるためにスレッドオブジェクトを返さなければなりません。 –

+0

私はGUIをブロックしないようにメインスレッドからこれを実行する問題にもっと焦点を当てるように答えを更新しました。 –

関連する問題