python threads

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

python threads

Δημοσίευσηαπό Dimitris » 09 Σεπ 2009, 14:35

Καλημέρα σας,

έχω ένα πρόβλημα με την python και τα threads. Πιο συγκεκριμένα ο παρακάτω κώδικας λειτουργεί περίφημα σε linux αλλά σε windows xp & mac os x 1.4 κολλάει.
Κώδικας: Επιλογή όλων

from Tkinter import *
import threading
def figure():
def myfigure():
root=Tk()
root.mainloop()
if threading.active_count()==1:
t = threading.Thread(target=myfigure)
t.start()
elif threading.active_count()>1:
print "thread already running"

figure() # θα εμφανιστεί ένα Tk παράθυρο, άστο ανοιχτό.
figure() # πρέπει να σου πετάξει το thread running
# κλείσε το παράθυρο
figure() # ξαναδημιουργεί το παράθυρο

Στο σημείο αυτό το παράθυρο Tk που άνοιξε, κολάει. Μπορεί να το δοκιμάσει κάποιος και να μου πει τι συμβαίνει σε άλλα συστήματα. Τι λάθος κάνω; (edit: σίγουρα δεν είναι bug)

Σημείωση: χρησιμοποιώ 2.6.2 σε ubuntu, 2.5 & 2.6.2 σε Mac os x, και δε γνωρίζω τι σε windows xp (ενας φίλος το δοκίμασε)
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: python threads

Δημοσίευσηαπό medigeek » 09 Σεπ 2009, 17:38

Απ'ό,τι διάβασα, μπλοκάρει με το threading:
http://mail.python.org/pipermail/python ... 95504.html

Υπάρχει ειδικός λόγος για το threading; Βρήκα μερικές λύσεις και χρησιμοποιούν το after method:

Κώδικας: Επιλογή όλων

#!/usr/bin/python
""" after method:
http://www.pythonware.com/library/tkinter/introduction/x9507-alarm-handlers-and-other.htm
"""

""" Source: http://www.faqts.com/knowledge_base/view.phtml/aid/4340

after-method.py

Test program for the after method. Adds a random number to the
ScrolledText box every 500 ms.
Also shows how to make the ScrolledText box scrolls down automatically
so we will always see the latest numbers.

"""

""" Savvas Radevic added:
Using random instead of whrandom
"""

from Tkinter import *
from ScrolledText import ScrolledText
import random, time

class MyThing (Frame):

def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()

def createWidgets(self):
self.textBox = ScrolledText(self, height=15, width=30)
self.textBox.pack()

# setting up random stuff
random.seed = time.time()

# registering callback
self.listenID = self.after(500, self.addnumber)

def addnumber(self):
number = int(random.random() * 1000)
self.textBox.insert(END, str(number) + "\n")
self.textBox.yview("moveto", 1.0)
self.listenID = self.after(500, self.addnumber)


mything = MyThing()
mything.mainloop()


Βολεύει; :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: python threads

Δημοσίευσηαπό Dimitris » 09 Σεπ 2009, 19:01

Ευχαριστώ, ούτε αυτό το ήξερα. Αλλά όχι δεν κάνει. Μετά το mainloop χάνεται ο έλεγχος, από τη γραμμή εντολών/αρχείο. Τη mail list την είδα κι αυτή αργότερα. Αυτό που θέλω είναι να δημιουργώ παράθυρα Tk (ή gtk/qt) από τη γραμμή εντολών χωρίς να χάνω τον έλεγχο. Και με τα λίγα που κατέχω φαντάζομαι ότι γίνεται με threads. To idle για παράδειγμα χρησιμοποιεί 2 threads όταν λειτουργεί.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: python threads

Δημοσίευσηαπό medigeek » 10 Σεπ 2009, 01:59

Δεν έχω ιδέα για να σου πω την αλήθεια, με τα threads δεν ασχολήθηκα και πολύ, μιας και υπάρχει το gobject.timeout_add() για gtk :)

Υπάρχει ένα καλό tutorial όμως, μάλλον πρέπει να δημιουργήσεις class για το threading :?: :silent:
http://www.devshed.com/c/a/Python/Basic ... -Python/1/
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: python threads

Δημοσίευσηαπό Dimitris » 10 Σεπ 2009, 11:05

Ύστερα από λίγο διάβασμα (εδώ για παράδειγμα http://effbot.org/zone/tkinter-threads.htm) διαπιστώνω ότι υπάρχουν πολλές συζητήσεις επί του θέματος (μέχρι και να κάνεις compile το tk με --enable-thread, που κάτι τέτοιο δεν είναι λύση για μένα). Επίσης είναι πιο ασφαλές (thread safe) να δημιουργηθούν δύο threads, το βασικό που θα περιλαμβάνει το Tkinter.mainloop() και το δευτερεύον που θα είναι ο python interpreter και θα επικοινωνεί με το. Όπως δηλαδή κάνουν όλα τα python guis.

Πόσα έχει να μάθουμε ακόμη :o
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: python threads

Δημοσίευσηαπό Dimitris » 11 Σεπ 2009, 10:56

Παρατήρησα επίσης ότι αν ανοίξω την python από το τερματικό και γράψω:
Κώδικας: Επιλογή όλων
from Tkinter import *
root= Tk()

ανοίγει ένα παράθυρο, αλλά αν κάνω το ίδιο από το idle τότε δεν ανοίγει και περιμένει την εντολή
Κώδικας: Επιλογή όλων
root.mainloop()

όπου και χάνει τον έλεγχο φυσικά. Έχει κανείς καμιά ιδέα γιατί συμβαίνει αυτό;
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: python threads

Δημοσίευσηαπό Dimitris » 11 Σεπ 2009, 11:04

Λοιπόν, αρχίζω και καταλαβαίνω. Σε ένα παλιό email του G.v.R. http://mail.python.org/pipermail/edu-si ... 03165.html λέει να ξεκινήσουμε το idle με την επιλογή -n (No subprocess) και τότε λειτουργεί όπως η γραμμή εντολών. Δε ξέρω βέβαια τι μειονεκτήματα έχει αυτή η επιλογή.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση


Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι