Προς το περιεχόμενο

Τερματισμος Thread


ntaryl

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημερα παιδια

Το τελευταιο διαστημα δουλευω σε ενα project που χρησιμοποιει Socket,Threads.

Συγκεκριμενα ενα Socket κανει Listen και για καθε Πελατη που δεχεται δημιουργει και ενα νεο thread.

Ετσι αν εχουμε συνδεμενους 100 Πελατες τοτε θα εχουμε και 100 Threads να τρεχουν .

Ανα διαστημα 10 Λεπτων τσεκαρετε με την βοηθεια ενος Timer αν ολοι οι Πελατες παραμενουν συνδεμενοι στον Server.

Αν καποιο Socket εχει αποσυνδεθει τοτε πρεπει να τερματισω το Thread που χρησιμοποιει αυτο το socket ..

Θα ηθελα να μου πει καποιος που γνωριζει ποιο ειναι το καλυτερο για αυτη την περιπτωση ?

Ευχαριστω πολυ

Δημοσ.

Καλησπερα

Ενδιαφερομαι για τροπο να τερματισω το 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.

Δημοσ.

Καλησπερα

Ενδιαφερομαι για τροπο να τερματισω το 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.

Δημοσ.

καλησπερα

Το ζητουμενο ηταν να μπορεσω να τερματισω ενα 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 τερματιζονται τελεια

καλο βραδυ

 

Υ.γ Εγραψα την λυση ισως καποιος αντιμετωοπισει παρομοιο προβλημα

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...