11月1日晚些时候开始了部分返回工作
我想把一个值发送给一个程序/线程,重置这个值,然后再做一次,11次。程序/线程将与主程序/线程同时运行。我希望“子线程”向主程序/线程报告,主线程将显示在gui上,其中每个线程当前正在处理,这样我就可以大致了解整个任务完成之前需要多长时间。这是最初的概念,现在我想结合另一个程序,它将从互联网上下载其他图像,而这个程序正在互联网上搜索某些音频/视频文件。这部分程序的执行时间比图像下载要长(45分钟,而图像下载大约需要4-5分钟)。在
一旦图像下载完成,我希望能够浏览图像。因此,母线程必须是“全功能”的,而不是捆绑在一起。在
随着我不断学习Python中我在VB6中从未真正拥有的功能,这个想法不断扩展。在
几分钟前我在旧帖子中看到Tkinter只与主线程一起工作。因此,我总是在下面的代码中得到错误。在
有没有办法在不锁定主程序/线程的情况下,让子线程向主线程报告,让主线程更新屏幕,同时让主线程正常工作(下载/显示图像)?在
以下是我目前的出发点。在
import os
import sys
import urllib
from tkinter import *
import threading
import time
class Startup:
def __init__(self, root):
self.DrawArea = Canvas(root, height=250, width=200,bg = 'black')
self.starthere()
def dl_0(self):
self.NxtNum0 = int(self.HiStr0)
while self.NxtNum0 < int(self.HiStr0)+100:
self.DrawArea.create_text(50,12,text = str(self.NxtNum0), fill = 'white', tags = '0')
self.NxtNum0 +=1
#download routine goes here once the on screen update routine gets straightened out, time.sleep(.1) will be removed
time.sleep(.1)
#self.DrawArea.delete('0')
def dl_1(self):
self.NxtNum1 = int(self.HiStr1)
while self.NxtNum1 < int(self.HiStr1)+100:
self.DrawArea.create_text(50,37,text = str(int(self.NxtNum1)), fill = 'white', tags = '1')
self.NxtNum1 +=1
#download routine goes here once the on screen update routine gets straightened out, time.sleep(.1) will be removed
time.sleep(.1)
#self.DrawArea.delete('1')
#continue on through all 11 threads
def starthere(self):
#find current highest value
Hival = open("Highest.txt", "r")
Histr = Hival.read()
Hival.close()
self.HiStr0 = str(int(Histr)+1)
HiStra = int(int(Histr)/10000)
#call download #0
dl0 = threading.Thread(target = self.dl_0, name = 'dl0')
dl0.start()
#setup/call download #1
self.HiStr1 = str(str(HiStra+1)+"0000")
dl1 = threading.Thread(target = self.dl_1, name = 'dl1')
dl1.start()
#continue on down through all 11 threads
if (__name__ == "__main__"):
os.chdir ('/media/')
root = Tk()
root.geometry("200x250")
Thr = Startup(root)
上面所说的,就像我说的,是为了让这件事正常工作,一天中大部分时间都没有上网。我想我理解了Tkinter的局限性,与现在应该写的相比,它确实写得有点怪。在
我承认在最初的部分完成版本中,我使用子进程创建了11个单独的gui/程序。他们无法将值发送回主程序(至少据我所知)。我更喜欢这样的想法:只使用一个程序,让子线程报告主线程,让主线程不断更新屏幕,显示11个子线程中当前正在查看的文件的文件号。我可以这样做,仍然有更新的屏幕,并能够继续使用和显示其他线程(非11以上)在同一时间?在
我希望这不是完全令人困惑…抱歉,如果是的话。在
穿线是最好的解决方案吗? 您可以从gui派生子进程来下载图像 看看多处理中的process pool类。在
eg可以是一个下载类,gui为下载生成多个进程。在
记住线程运行在相同的内存空间中,而进程有单独的内存。在
这些可能有用 Multiprocessing vs Threading PythonStatus of mixing multiprocessing and threading in PythonIs it safe to fork from within a thread?
相关问题 更多 >
编程相关推荐