Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Πρόβλημα στον τερματισμό ενός Thread.

Πρόβλημα στον τερματισμό ενός Thread. 9 Χρόνια 7 Μήνες πριν #2876

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
def AcceptClientThread():
    global client, address, sock, PORT
 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
    try:
        PORT = int(PORT)
        sock.bind((IP, PORT))
        pass
 
    except:
        box = wx.MessageDialog(None, "Failed to create connection.", "Connection Failed", wx.OK)
        box.ShowModal()
        box.Destroy()
        sock = None
        return
 
    sock.listen(1)
 
    while (running):
        cl, addr = sock.accept()
        client.append(cl)
        address.append(addr)
        print("A client has been connected!")

Το πρόβλημά μου είναι το εξής:

Όταν η running == False το loop μου δεν τερματίζεται
και ο λόγος γιαυτό είναι ότι η γραμμή
cl, addr = sock.accept()
δεν εκτελείτε ποτέ εφόσον έχω κλείσει την σύνδεσή μου.
Επομένως το πρόγραμμα στο Thread μου παραμένει εκεί
και δεν συνεχίζει έτσι ώστε να ξανά φτάσει στον έλεγχο
και να τερματιστεί.

Αν και όταν τρέχει η εντολή που δίνει στην running τιμή
False ταυτόχρονα τρέχω και sock.close() αυτό δεν επηρεάζει
την γραμμή cl, addr = sock.accept() εφόσον είχε εκτελεστή
προτού την sock.close()(Άμα καταλάβατε τη εννοώ :p ).

Υπάρχει κάποιος τρόπος να κλείσω το thread απότομα?
Η τουλάχιστον να αναγκάσω την python να κάνει skip
την γραμμή cl, addr = sock.accept() .

Ευχαριστώ.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα στον τερματισμό ενός Thread. 9 Χρόνια 7 Μήνες πριν #2877

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Ίσως αντί για sock.close() να δοκίμαζες την sock.shutdown().
Επίσης θα βοηθούσε αν βλέπαμε ολόκληρο τον κώδικα.

Περισσότερα εδώ.
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα στον τερματισμό ενός Thread. 9 Χρόνια 7 Μήνες πριν #2878

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Κρίμα στην python 2.7 δεν υπάρχει αυτήν η μέθοδος shutdown.

Αν έχετε όρεξη να διαβάσετε όλο των κώδικα δεν έχω πρόβλημα.
Δεν έχω βάλει σχόλια όμως :P
# -*- coding: utf-8 -*-
 
import wx, threading, socket
 
running = True
title   = "Private Comminicator"
pixels  = (300,150)
myList  = ['a', 'b', 'c']
IP      = ""
PORT    = 5456
sock    = None
client  = []
address = []
 
class guiApp(wx.Frame):
 
    def __init__(self, parent, __id__):
 
        wx.Frame.__init__(self, parent, __id__, title, size = pixels)
 
        self.panel = wx.Panel(self)
        createMenu(self)
        return
 
 
    def createServer(self, event):
        global IP, PORT
 
        if (sock == None):
            IP   = Input("Give an IP address:", "Create Connection")
            PORT = Input("Give a port:", "Create Connection")
 
            if (IP == None or PORT == None):
                return
 
            self.acceptClient = threading.Thread(target = AcceptClientThread)
            self.acceptClient.start()
            return
 
        else:
            box = wx.MessageDialog(None, "You already running a server.", "Connection Failed", wx.OK)
            box.ShowModal()
            box.Destroy()
            return
 
 
    def joinServer(self, event):
        global IP, PORT, sock
 
        if (sock == None):
            IP   = Input("Give an IP address:", "Create Connection")
            PORT = Input("Give a port:", "Create Connection")
 
            if (IP == None or PORT == None):
                return
 
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
            try:
                PORT = int(PORT)
                sock.connect((IP, PORT))
                pass
 
            except:
                box = wx.MessageDialog(None, "Failed to join connection.", "Connection Failed", wx.OK)
                box.ShowModal()
                box.Destroy()
                sock = None
                return
 
        else:
            box = wx.MessageDialog(None, "You already joined a server.", "Connection Failed", wx.OK)
            box.ShowModal()
            box.Destroy()
            return
 
 
    def stopConnection(self, event):
        global sock, client, address, running
 
        if (sock != None):
 
            sock.close()
            sock = None
 
            client  = []
            address = []
 
            self.acceptClient.shutdown()
            return
 
        else:
            box = wx.MessageDialog(None, "There is no connection.", "ERROR", wx.OK)
            box.ShowModal()
            box.Destroy()
            return
 
 
 
def createMenu(self):
 
    statusBar = self.CreateStatusBar()
    menuBar   = wx.MenuBar()
 
    File = wx.Menu()
 
    createConn = File.Append(wx.NewId(), "Create Connection", "This will create a server.")
    joinConn   = File.Append(wx.NewId(), "Join Connection", "This will join a server.")
    stopConn   = File.Append(wx.NewId(), "Stop Connection", "This will destroy a server or disconnect from a server.")
 
    menuBar.Append(File, "File")
 
    self.Bind(wx.EVT_MENU, self.createServer, createConn)
    self.Bind(wx.EVT_MENU, self.joinServer, joinConn)
    self.Bind(wx.EVT_MENU, self.stopConnection, stopConn)
 
    self.SetMenuBar(menuBar)
    return
 
 
def Input(message, title):
 
    box = wx.TextEntryDialog(None, message, title)
 
    if (box.ShowModal() == wx.ID_OK):
        return box.GetValue()
    pass
 
 
def AcceptClientThread():
    global client, address, sock, PORT
 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
    try:
        PORT = int(PORT)
        sock.bind((IP, PORT))
        pass
 
    except:
        box = wx.MessageDialog(None, "Failed to create connection.", "Connection Failed", wx.OK)
        box.ShowModal()
        box.Destroy()
        sock = None
        return
 
    sock.listen(1)
 
    while (running):
        cl, addr = sock.accept()
        client.append(cl)
        address.append(addr)
        print("A client has been connected!")
 
 
 
 
 
 
 
if (__name__ == "__main__"):
 
    app   = wx.PySimpleApp()
    frame = guiApp(None, -1)
 
    frame.Show()
    app.MainLoop()
 
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα στον τερματισμό ενός Thread. 9 Χρόνια 7 Μήνες πριν #2879

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Γιατί χρησιμοποιείς Python 2;
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα στον τερματισμό ενός Thread. 9 Χρόνια 7 Μήνες πριν #2884

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
pmav99 έγραψε:
Γιατί χρησιμοποιείς Python 2;

Γιατί το module wxPython δεν υπάρχει για python 3.
Τέλως πάντων, ξανά γύρισα στο tkinter επομένος
τώρα προγραμματίζω σε python 3 ξανά. :laugh:
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα στον τερματισμό ενός Thread. 9 Χρόνια 7 Μήνες πριν #2885

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
τσέκαρε και το pyqt
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.276 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου