ntaryl Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Καλημερα παιδια Το τελευταιο διαστημα δουλευω σε ενα project που χρησιμοποιει Socket,Threads. Συγκεκριμενα ενα Socket κανει Listen και για καθε Πελατη που δεχεται δημιουργει και ενα νεο thread. Ετσι αν εχουμε συνδεμενους 100 Πελατες τοτε θα εχουμε και 100 Threads να τρεχουν . Ανα διαστημα 10 Λεπτων τσεκαρετε με την βοηθεια ενος Timer αν ολοι οι Πελατες παραμενουν συνδεμενοι στον Server. Αν καποιο Socket εχει αποσυνδεθει τοτε πρεπει να τερματισω το Thread που χρησιμοποιει αυτο το socket .. Θα ηθελα να μου πει καποιος που γνωριζει ποιο ειναι το καλυτερο για αυτη την περιπτωση ? Ευχαριστω πολυ
παπι Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 αν πεσει dc τοτε το GetLastError θα σου δωσει τη τιμη http://msdn.microsoft.com/en-us/library/ms740668(v=vs.85).aspx#WSAENOTCONN αρα βαρας ενα break και εισαι οκ
ntaryl Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 Καλησπερα Ενδιαφερομαι για τροπο να τερματισω το thread !!!
παπι Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Καλησπερα Ενδιαφερομαι για τροπο να τερματισω το thread !!! Οταν πεσει dc τοτε ολες η funcs επιστρεφουν error, με το καλεσμα της getlasterror βλεπεις τι ακριβος εγινε, αν το lasterro ειναι αυτο που σου ειπα τοτε η συνδεση χαθηκε. Εφοσον δουλευεις με σε σειριακες socket ανα thread (κακος καλυτερα δες multiplex socket, google socket select) σημαινει οτι εχεις ενα handshake μεσα σε ενα infinity loop. Δηλαδη send,recv,send,recv..... Εσυ βαζεις thread επειδη αυτες κολλανε,πχ θα εχεις μια recv που θα περιμενει καποια δεδομενα. Εεε λοιπον, οταν πεσει dc τοτε η κολλημενη recv θα ξεκολλησει επιστρεφοντας error. Εφοσον εχεις το error και το lastError ειναι dc τοτε σπας το infinity loop, εφοσον σπασει το infinity loop το thread θα συνηχησει την πορεια του, που λογικα ειναι ο καθαρισμος διαφορων στοιχειων και επειτα το τερματισμο του. edit Αν επεμενεις να σκωτοσεις ενα thread τοτε δες αυτο και φυσικα αυτο TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems: If the target thread owns a critical section, the critical section will not be released. <-- Δωσε βαση σε αυτο!!!!!!!!!!!!!! If the target thread is allocating memory from the heap, the heap lock will not be released. If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent. If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.
defacer Δημοσ. 1 Ιουνίου 2011 Δημοσ. 1 Ιουνίου 2011 Καλησπερα Ενδιαφερομαι για τροπο να τερματισω το thread !!! Αν θελεις να τερματίσεις το thread και είσαι μέσα στο ίδιο το thread Κάνεις return από την function από την οποία ξεκίνησε να τρέχει. Problem solved. Αν θελεις να τερματίσεις το thread και είσαι μέσα σε άλλο thread Δεν υπάρχει ασφαλής τρόπος να γίνει αυτό, με ελάχιστες εξαιρέσεις που δε νομίζω να εφαρμόζονται στην περίπτωσή σου. Αλλά δε μπορώ και να ξέρω γιατι δε μας λες καν σε τι γλώσσα γράφεις! (υπάρχει φυσικά μπακάλικος "έλα μωρέ δουλεύει" τρόπος, αλλά δεν τον άκουσες απο μένα). Αυτό που μπορείς να κάνεις είναι να πεις στο thread να τερματιστεί, και ενδεχομένως (αν σε ενδιαφέρει να κάνεις κάτι 100% σίγουρα αφότου το thread έχει τερματίσει) να περιμένεις να τερματίσει όντως (αυτό αναφέρεται ως join, δε μπορώ να είμαι πιο συγκεκριμένος όπως είπαμε παραπάνω). Για να τερματίσει το ίδιο το thread τον εαυτό του, το πιο απλό είναι να κάνεις return από την function από την οποία ξεκίνησε να τρέχει. Για να πεις στο thread να τερματιστεί πρέπει να γίνουν 2 πράγματα: 1. Εσύ να του το πεις 2. Και κείνο να το ακούσει Το πρώτο είναι πολύ εύκολο, ας πούμε ότι κάθε thread έχει κάποιες μεταβλητές accessible και από το main thread. Βάζεις σ' αυτές και μία bool που έχει το νόημα "όταν γίνει true σταματάς". Το δεύτερο εξαρτάται από το τι κάνει το thread σου. Αν είναι σε busy loop (που στην περίπτωσή σου δεν είναι), τότε απλά ελέγχεις τη μεταβλητή κάθε όποτε θες. Διαφορετικά, αν είναι blocked επειδή κάνεις wait πάνω σε κάτι ή επειδή χρησιμοποιείς synchronous I/O (που κατά 99% αυτό κάνεις) τότε πρέπει να διαβάσεις το documentation της συγκεκριμένης function την οποία καλείς και κάνεις block για να δεις τι επιλογές υπάρχουν και υπό ποιές συνθήκες επιστρέφει η function (για να προκαλέσεις εσύ την επιστροφή της από τη main thread με κάποιο τέτοιο τρόπο). Αφότου επιστρέψει, τότε απλά όπως και πριν κοιτάς την bool και αν είναι true κάνεις return από το thread.
ntaryl Δημοσ. 6 Ιουνίου 2011 Μέλος Δημοσ. 6 Ιουνίου 2011 καλησπερα Το ζητουμενο ηταν να μπορεσω να τερματισω ενα Thread απο το οποιο ξερουμε μονο το ThreadID και οχι το Handle του Thread Τελικα τα καταφερα με την Βοηθεια της OpenThread Function > Private Const THREAD_TERMINATE As Long = &H1 Private Declare Function OpenThread Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Boolean, ByVal dwThreadId As Long) As Long Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long Public Function DestroyThread(ByVal ThreadID As Long) As Boolean TerminateThread OpenThread(THREAD_TERMINATE, False, ThreadID), 0 End Function Τα Threads τερματιζονται τελεια καλο βραδυ Υ.γ Εγραψα την λυση ισως καποιος αντιμετωοπισει παρομοιο προβλημα
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.