2012-04-03 17 views
5

Próbuję utworzyć skrypt w języku Python, który wykorzystuje moduł wieloprocesowy do tworzenia 2 (lub więcej) okien GTK. Uderzam w ścianę, jak się wydaje. Oto kod i błędy Dostaję:Python - procesor wielkoformatowy z 2 okienkami gtk

p1 = Process(target=tiny_gtk_process, name="process 1") 
p1.start() 
p2 = Process(target=tiny_gtk_process, name="process 2") 
p2.start() 

oraz:

def tiny_gtk_process(): 

    import gtk 

    window = gtk.Window() 
    window.set_size_request(800,600) 

    window.show_all() 

    gtk.main() 

większość czasu otrzymuję:

multiwin.py: Błąd krytyczny IO 0 (Sukces) na serwerze X: 0.0. python: ../../src/xcb_io.c:249: process_responses: Assertion `(((long) (dpy-> last_request_read) - (long) (dpy-> request)) < = 0) 'nie powiodło się.

Czasami dostaję:

multiwin.py: Fatal error 11 IO (Zasoby chwilowo niedostępne) na serwerze X: 0.0.

Czy problem dotyczy pętli gtk? Czy ich przetwarzanie wielopoziomowe nie powoduje ich izolacji?

Wszelkie pomysły byłyby bardzo pomocne.

+0

Czy na pewno chcesz użyć trybu wieloprocesowego, czy po prostu chcesz mieć 2 okna? – liberforce

+0

Naprawdę potrzebuję tego w osobnych procesach. –

+0

Czy importujesz gtk do skryptu wywołującego? Byłem w stanie odtworzyć twój problem, gdy miałem wywoływanie gtk w skrypcie wywołującym, ale nie po usunięciu go, a import jest tylko w funkcji tiny_gtk_process. – bohrax

Odpowiedz

0

Najprawdopodobniej problem polega na użyciu procesu wieloprocesowego. Proces, który tworzy nowe procesy za pomocą fork() zamiast exec(). Oznacza to, że każdy pod-proces współużytkuje ten sam plik, co jego rodzic, w tym te, które łączą go z serwerem X. Awaria jest spowodowana, ponieważ wiele procesów próbuje komunikować się z serwerem jednocześnie za pośrednictwem tego samego połączenia.

Lepszym rozwiązaniem byłoby użycie podprocesu.Popen lub podobny, aby rozpocząć procesy. Jeśli chcesz uzyskać komunikację wieloprocesową między procesami, zobacz my answer to this question.