2016-08-28 5 views
0

Nファイルを開く必要があり、N-newファイルを取得します。私はGUIのtkinterのフリーズを防ぐためにスレッドを使用することで、時間に1つのファイルを処理します。実際にファイルを処理するには、約1〜2分待つ必要があります。以下のテストコードで スレッドを使用して一度に1つのファイルを読み書きする方法

open file1-->read-->create new file1-->close file 
open file2-->read-->create new file2-->close file 
open file3-->read-->create new file3-->close file 

、読み取りおよび書き込みモードで開いたファイルが存在しない、私は単純なリストを使用します。 whileループでカウントが大きな数である場合、私は右の結果を持っていませんでした。解決

#I expect an output like: 
#100000000 file1 test release 
#100000000 file2 test release 
#100000000 file3 test release 
#Indeed I obtain strange result like file3 as first result not in third position 

from tkinter import filedialog 
from tkinter import * 
from tkinter import ttk 
import threading, time 

def th(lol): 
     global mythread, lock 
     mythread = threading.Thread(target=aprifil2, args=(lol,)) 
     mythread.start() 

def aprifil2(lol): 
       global lock, m 
       lock.acquire() 
       try: 
        s=0 
        while(s<100000000): 
         s+=1 
        print(s, i) 
        scr() 
       finally: 
         print('release\n') 
         try: 
          lock.release() 
         except RuntimeError: 
              print('end') 

def scr(): 
      print('test\n') 

def ok(): 
      global lock, i 
      lock = threading.Lock() 
      m=['file1','file2', 'file3'] 
      for i in m: 
        lol=i 
        th(lol) 
        time.sleep(1) 

finestra= Tk() 
button_cerca = ttk.Button(finestra, text = "avvia", command = ok) 
button_cerca.pack() 
button_a = Entry(finestra) 
button_a.pack() 
+0

あなたは3つのファイルが順次処理されたいわけ?その場合、1つのスレッドを作成し、3つのスレッドではなく3つのファイルを処理する必要があります。 –

+0

はい。 1つのスレッドはenoghtですが、私はtkinter GUIがフリーズしないようにする必要があります...とにかく私はどこで間違っているのか分かりません。 – lausent

答えて

0

は問題:

from tkinter import * 
from tkinter import ttk 
from datetime import datetime as dt 
import threading, time 


def th(): 
     global mythread, cro 
     mythread = threading.Thread(target=ok) 
     cro = threading.Thread(target=cronou) 
     mythread.start() 

def aprifil2(z): 
         global m, state_crono, zero 
         s=0 
         while(s<10000000): 
           s+=1 
         print(s, z) 
         scr() 
         print(crono.get()) 
         print('\n') 
         zero = dt.now()-dt.now() 
         if(z==m[len(m)-1]): 
             state_crono = False 
             time.sleep(0.01) 
             crono.set('') 

def scr(): 
      print('test\n') 

def ok(): 
      global i, m, state_crono 
      state_crono = True 
      cro.start() 
      m=['file1','file2', 'file3'] 
      for z in m: 
        aprifil2(z) 

def cronou(): 
      global zero 
      zero = dt.now()-dt.now() 
      while(state_crono == True): 
             ti = dt.now() 
             time.sleep(0.01) 
             tf = dt.now() 
             zero += tf-ti 
             crono.set(str(zero)[0:10]) 

finestra= Tk() 
button_cerca = ttk.Button(finestra, text = "avvia", command = th) 
button_cerca.pack() 
button_a = Entry(finestra) 
button_a.pack() 
crono = StringVar() 
tex_cronometro = Label(finestra, textvariable=crono, font=("Helvetica",11,"bold")) 
tex_cronometro.pack() 
finestra.mainloop() 
+0

このコードは理解するのが難しく、おそらく他の人には役に立ちません。説明を追加するとよいでしょう。例えば、while(s <10000000)ループのポイントは何ですか?意味のある変数名を使うと助けになります - 'z'と' m'は、それらが何を表しているかについてのヒントを与えません。 –

+0

whileループは書き込みプロセス(新しいファイル)を表します。 "z"は、順番に開く必要がある各ファイルを表します。だから私は1つのファイル(z [0]、z [1]など...など)と書き込みを開きます。 – lausent

関連する問題