Tôi có một quá trình sẽ mất một lúc (có thể là một hoặc hai phút) để hoàn tất. Khi tôi gọi nó từ GUI pygtk của tôi, cửa sổ sẽ khóa (tối và ngăn chặn hành động của người dùng) sau khoảng 10 giây.Ngừng pygtk GUI khỏi khóa trong quá trình chạy dài
Tôi muốn dừng điều này xảy ra, nhưng tôi không chắc chắn như thế nào. Tôi nghĩ rằng đa luồng sẽ là câu trả lời, nhưng nó dường như không hoạt động. Tôi đã thử hai phương pháp khác nhau mà tôi tìm thấy trực tuyến. Đầu tiên, tôi sửa đổi this FAQ để có một chức năng chạy dài. Thứ hai tôi đã thử sử dụng luồng.Thread trực tiếp như trong this answer, nhưng điều đó cũng bị khóa.
Hai mẫu của tôi dưới đây. Tôi mới sử dụng đa luồng, vì vậy có lẽ đó không phải là giải pháp mà tôi đang tìm kiếm. Về cơ bản, tôi chỉ cố gắng giữ giao diện GUI khóa lại để tôi có thể cập nhật với thanh tiến trình và cho phép người dùng sử dụng nút hủy.
#Sample 1
import threading
import time
import gobject
import gtk
gobject.threads_init()
class MyThread(threading.Thread):
def __init__(self, label, button):
super(MyThread, self).__init__()
self.label = label
self.button = button
self.counter = 0
button.connect("clicked", self.on_button_click)
self.quit = False
def update_label(self, counter):
self.label.set_text("Counter: %i" % counter)
time.sleep(20)
return False
def on_button_click(self, widget):
self.counter += 1
gobject.idle_add(self.update_label, self.counter)
window = gtk.Window()
label = gtk.Label()
box = gtk.VBox()
button = gtk.Button("Test")
box.pack_start(label)
box.pack_start(button)
window.add(box)
window.show_all()
window.connect("destroy", lambda _: gtk.main_quit())
thread = MyThread(label, button)
thread.start()
gtk.main()
thread.quit = True
#####################################
#Sample 2
from threading import Thread
import time
import gobject
import gtk
class Test():
def __init__(self):
self.counter = 0
self.label = gtk.Label()
button = gtk.Button("Test")
window = gtk.Window()
box = gtk.VBox()
box.pack_start(self.label)
box.pack_start(button)
window.add(box)
window.connect("destroy", lambda _: gtk.main_quit())
button.connect("clicked", self.on_button_click)
window.show_all()
def update_label(self, counter):
self.label.set_text("Counter: %i" % counter)
time.sleep(20)
return False
def on_button_click(self, widget):
self.counter += 1
thread = Thread(target=self.update_label, args=(self.counter,))
thread.start()
while thread.is_alive():
pass
thread.stop()
test = Test()
gtk.main()
Được rồi, điều này có ý nghĩa. Tôi hiểu tại sao tôi không thể liên tục thăm dò ý kiến về trạng thái của luồng. Nhưng tôi cần biết khi nào sợi hoàn tất. Nếu tôi thêm thanh trạng thái cho tiến trình của luồng, làm cách nào tôi có thể biết thời điểm dừng thanh trạng thái? –
Tôi đã thêm thanh tiến trình vào ví dụ. 'glib.timeout_add' cho phép bạn thăm dò trạng thái luồng mà không làm cho ứng dụng của bạn không phản hồi. – jcollado
Tuyệt vời. Điều này thật ý nghĩa. Tôi không biết về 'glib.timeout_add'. Cảm ơn bạn đã giúp đỡ. –