Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    C problema interruzione windows thread

    Ciao a tutti...
    ho notato che la funzione CloseHandle() non riesce a chiudermi un thread... non ho capito il motivo e ho usato TerminateThread() che da quello che ho capito è molto più drastica e sarebbe meglio non utilizzarla.. ci sono delle situazioni in cui CloseHandle può fallire?

    come lo utilizzo:

    codice:
    
    thread_handle[READ_THREAD] = CreateThread(NULL,0,function,NULL,0,NULL);
    	
    
    [...]
    
    CloseHandle(thread_handle[READ_THREAD])
    grazie per ogni delucidazione

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: C problema interruzione windows thread

    Originariamente inviato da neryo
    ho notato che la funzione CloseHandle() non riesce a chiudermi un thread...
    Infatti serve solo per chiudere l'handle di un certo oggetto (thread, file, mutex, ecc...).

    Originariamente inviato da neryo
    ho usato TerminateThread() che da quello che ho capito è molto più drastica e sarebbe meglio non utilizzarla
    Sì, è pericolosa ed è preferibile non usarla. La soluzione ideale è che il thread termini "naturalmente" cioè quando la funzione principale del thread termina o quando si chiama (nel thread) ExitThread() (che è chiamata anche implicitamente alla fine della funzione).

    La domanda quindi è: cosa fa a livello pratico il tuo thread? C'è la possibilità che nel tuo thread ogni tanto ci si possa chiedere "devo terminare?" testando ad esempio una qualche variabile?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Infatti serve solo per chiudere l'handle di un certo oggetto (thread, file, mutex, ecc...).
    appunto.. quindi non dovrebbe chiudermi anche un thread? ho visto degli esempi su web che la utlizzavano..

    Sì, è pericolosa ed è preferibile non usarla. La soluzione ideale è che il thread termini "naturalmente" cioè quando la funzione principale del thread termina o quando si chiama (nel thread) ExitThread() (che è chiamata anche implicitamente alla fine della funzione).

    La domanda quindi è: cosa fa a livello pratico il tuo thread? C'è la possibilità che nel tuo thread ogni tanto ci si possa chiedere "devo terminare?" testando ad esempio una qualche variabile?
    alla in pratica il 3d viene avviato da un bottone e deve svolgere un compito ogni tot secondi.. la mia implementazione é stata quella di creare il thread quando premo il bottone e con un ciclo infinito che ad ogni step rimane in attesa (sleep) di tot secondi. Questo per evitare di usare i timer e ricreare sempre il thread...

    Pero' ad un certo punto devo permetterne la terminazione tramite la pressione di un bottone.. quindi inizialmente avevo messo CloseHandle, poi visto che nn funzionava ho pensato a TerminateThread ma come dici anche tu non e' proprio safe come comportamento, anche se poi non vado a modificare dati sensibili non utilizzo lock o cose del genere
    Oppure metodo spartano, potrei definire un var globale che quando premo il bottone diventa ad es. false e termina il ciclo e quindi esce in maniera naturale visto che alla fine del thread ho chiamato esplicitamente ExitThread..

    altre idee o suggerimenti?

    grazie della risposta!



  4. #4
    ho optato al momento il metodo spartano.. in pseudo codice in pratica:

    codice:
    bool threadup = FALSE
    
    callback_start(){
    
    thread_handle[0] = CreateTread(..,..,func)
    
    }
    
    func(){
    
      threadup = TRUE;
    
      while(threadup != FALSE){
      
        fai qualcosa............
        Sleep(sec);
      }
    
     ExitThread(TRUE);
    }
    
    callback_stop(){
    
    threadup = FALSE;
    
    }

    se avete idee migliori fatevi avanti!

    ciao

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Intanto usare CreateThread può causare problemi di memory leak.
    In C/C++ è meglio usare _beginthreadex come consigliato su vari testi e manuali per ovviare a questo problema, in quanto alloca delle strutture interne alla libreria del C/C++ che CreateThread non fa.
    L'header è <process.h> ed è disponibile solo utilizzando la libreria multithreading del compilatore, così se per caso si utilizza per errore la libreria singlethreaded, si ha un errore di compilazione.
    Il valore di ritorno può essere utilizzato nelle funzioni delle api dopo un cast.
    http://msdn2.microsoft.com/en-us/lib...cb(VS.71).aspx
    per maggiori info.

    Poi, regola aurea lavorando con i thread è che ogni variabile condivisa dai thread stessi debba essere protetta da un mutex, altrimenti si possono verificare delle race condition.
    In questo caso mi sembra difficile possa accadere, ma non do per scontato che non possano accadere cose impreviste.

    Infine la ExitThread la trovo inutile. A differenza della TerminateThread, libera le risorse del sysop, ma non quelle eventualmente allocate dal thread (le new) e se non ricordo male, non vengono chiamati i distruttori.
    Meglio lasciare che il thread termini naturalmente con un bel return da qualche parte.
    Sempre in pseudo codice:
    codice:
    bool threadup = false;
    callback_start(){
       thread_handle[0] = (HANDLE) _beginthreadex(..,..,func)
    // thread_handle[0] = CreateTread(..,..,func)
    
    }
    
    func(){
    
      bool stop= false;
      /* sezione critica */ {
         stop = threadup;
      }
    
      while(stop != false){
      
        fai qualcosa............
        Sleep(sec);
      }
    
    // ExitThread(TRUE);
      return;
    }
    
    callback_stop(){
      /* sezione critica */ {
         threadup = true;
      }
    }

  6. #6
    Originariamente inviato da shodan
    Intanto usare CreateThread può causare problemi di memory leak.
    In C/C++ è meglio usare _beginthreadex come consigliato su vari testi e manuali per ovviare a questo problema, in quanto alloca delle strutture interne alla libreria del C/C++ che CreateThread non fa.
    grazie mille, ottimo consiglio non lo sapevo.... :rollo:

    Originariamente inviato da shodan
    Poi, regola aurea lavorando con i thread è che ogni variabile condivisa dai thread stessi debba essere protetta da un mutex, altrimenti si possono verificare delle race condition.
    In questo caso mi sembra difficile possa accadere, ma non do per scontato che non possano accadere cose impreviste.

    Infine la ExitThread la trovo inutile. A differenza della TerminateThread, libera le risorse del sysop, ma non quelle eventualmente allocate dal thread (le new) e se non ricordo male, non vengono chiamati i distruttori.
    Meglio lasciare che il thread termini naturalmente con un bel return da qualche parte.
    Sempre in pseudo codice:
    per la sezione critica non so, non mi sembra ne valga la pena...
    il rendere esplicita l'uscita del thread la vedo come la sicurezza che le risorse vengano rilasciate completamente..:master: ho visto che con questo metodo si può usare _endthreadex(0)

    grazie mille cmq! utilissimo intervento..


  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Infatti le funzioni vanno usate in coppia.
    _endthreadex dealloca le strutture allocate da _beginthreadex.
    Comunque le risorse del sistema operativo, vengono comunque deallocate quando il thread ha terminato il ciclo di esecuzione. La differenza consiste che i distruttori degli oggetti impiegati nel thread non sono chiamati con la _endthreadex.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da shodan
    Intanto usare CreateThread può causare problemi di memory leak.
    In C/C++ è meglio usare _beginthreadex come consigliato su vari testi e manuali per ovviare a questo problema, in quanto alloca delle strutture interne alla libreria del C/C++ che CreateThread non fa.
    Diciamola tutta in modo preciso. La documentazione di CreateThread dice:

    A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multi-threaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.