2009-11-25 26 views
6

Tôi đang viết một chương trình bằng một khung công tác bằng pygtk. Các chương trình chính thực hiện những điều sau đây:Python, thread và gobject

  1. Tạo một sợi cơ quan giám sát để theo dõi một số tài nguyên
  2. Tạo một khách hàng để nhận dữ liệu từ ổ cắm
  3. gọi gobject.Mainloop()

nhưng có vẻ như sau khi chương trình của tôi nhập Mainloop, thread watchdog cũng sẽ không chạy.

Cách giải quyết của tôi là sử dụng gobject.timeout_add để chạy điều khiển màn hình.

Nhưng tại sao tạo một chuỗi khác không hoạt động?

Đây là mã của tôi:

import gobject 
import time 
from threading import Thread 

class MonitorThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print "Watchdog running..." 
     time.sleep(10) 

def main(): 

    mainloop = gobject.MainLoop(is_running=True) 

    def quit(): 
     mainloop.quit() 

    def sigterm_cb(): 
     gobject.idle_add(quit) 


    t = MonitorThread() 
    t.start() 

    print "Enter mainloop..." 

    while mainloop.is_running(): 
     try: 
      mainloop.run() 
     except KeyboardInterrupt: 
      quit() 

if __name__ == '__main__': 

    main() 

Chương trình đầu ra chỉ "Watchdog chạy ... Nhập mainloop ..", sau đó không có gì. Dường như chuỗi không bao giờ chạy sau khi nhập mainloop.

+1

Bạn còn mong đợi điều gì nữa? Với đoạn mã trên, tôi mong đợi hai thứ đó sẽ được in một lần. – u0b34a0f6ae

Trả lời

9

Bạn có thể đăng một số mã không? Có thể bạn gặp sự cố với số Global Interpreter Lock.

Your problem solved by someone else :). Tôi có thể sao chép-dán bài viết ở đây, nhưng trong các chủ đề ngắn gọn của gtk có xung đột với các chủ đề Python. Bạn cần vô hiệu hóa c-threads bằng cách gọi gobject.threads_init() và tất cả nên là tốt.

+0

Cảm ơn, tôi thêm một số đoạn mã, có bất kỳ sai nào với mã này không? –

+0

OK. Cảm ơn vì thông tin. –

+2

Tôi rất vui vì bạn đã thêm một gợi ý ngắn trong câu trả lời vì liên kết hiện đã chết. – vidstige

2

Bạn không thể khởi chạy đường dẫn mã dựa trên luồng trong gtk.

Bạn phải nhớ hai điều khi sử dụng đề với PyGTK:

  1. GTK Chủ đề phải được khởi tạo với gtk.gdk.threads_init:

Từ http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html, bản quyền hoàn toàn giữ lại bởi tác giả. Thông báo bản quyền này không được xóa.

Bạn có thể nghĩ glib/gobject thay vì pygtk, nó giống nhau.

+0

Cảm ơn, tôi bỏ mới trong GTK. Thông tin giúp ích. –

Các vấn đề liên quan