Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] Creare un thread su un metodo di una classe

    Ciao ragazzi...mi servirebbe creare un thread su un metodo di una classe.
    Ho provato ma il compilatore dice che non posso...

    Quinidi ho provato a creare un thread su una funzione al di fuori della classe...e passargli come argomento (* void) "this".

    Poi però quando dovevo accedere alle istanze private della classe....errore perché non hai i permessi.....come posso fare???? aiuto mi sto crucciando da 2 giorni

  2. #2
    Intanto posta un pò di codice per vedere.
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  3. #3
    Normalmente prima di aprire una nuova discussione, si risponde all'ultima inserita..anche se ancora non hai risolto completamente il tuo problema, sarebbe gentile e rispettoso - soprattutto nei confronti di chi ti ha risposto - dare notizia circa lo stato del problema, se si è risolto o meno oppure la soluzione al problema stesso, in modo che in futuro altri utenti possano usufruire di tale risorsa.


    Fatta la premessa, andiamo alla discussione.
    L'argomento è molto generale, l'ideale sarebbe che tu postassi il codice o quantomeno che spiegassi il funzionamento della tua classe e il motivo della creazione di un nuovo thread, perchè magari ci sono soluzioni alternative.



    Ciao

  4. #4

    Re: [C++] Creare un thread su un metodo di una classe

    Originariamente inviato da kirakira93
    Quinidi ho provato a creare un thread su una funzione al di fuori della classe...e passargli come argomento (* void) "this".

    Poi però quando dovevo accedere alle istanze private della classe....errore perché non hai i permessi.....come posso fare???? aiuto mi sto crucciando da 2 giorni
    Trasforma la funzione al di fuori della classe in una funzione static membro della classe
    codice:
    class YourClass{
      static int YourThreadWorker (void * theArg);
    };
    
    int YourClass::YourThreadWorker (void * theArg){
      assert (null != theArg);
      YourClass * aClass = reinterpret_cast <YourClass *> (theArg);
      return 0;
    }
    Oppure dichiara la tua funzione al di fuori della classe friend della classe stessa.

    Tra le due in genere è meglio la prima soluzione.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    allora

    Mo scuso se non ho risposto nell'altra, ma è perché devo ancora provare a fare quella cosa con gli mp3...e visto che mi sono letto tutte le pagine dedicate a 1d3 v2.3 ho capito che ci proverò un giorno che sono libero perché non è molto semplice.


    Comuqnue tornando a noi, non ho postato codice perché dato che per creare il thread sto usando le funzioni fornite dalle SDL, in SDL_Thread.h...ho pensato che sarebbe abbastazna inutiole postare il codice, dato che non è molto usata come libreria e dato che sarebbe la stessa cosa penso anche con un qualsiasi createthread anche fornito dalle API di window o da afx.

    In ogni caso oggi o domani provo il primo metodo illustratomi e vi so dire.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    cmq

    comunque vi spiego a cosa serve così magari potete darmi suggerimenti.
    Praticamente c'è una classe che si chiama class window con questa si possono creare finestre che si servono delle SDL .
    Quando si avvia il costruttore, oltre alla creazione della finestra, si attiva un thread, che deve accedere ad una struttura di eventi (mouse tastiera, etc) privata alla classe così definita: SDL_Event message;
    Per questo mi serve che un metodo interno alla classe sia usato come thread.

    Questo è il codice dell'ultimo tentativo fatto ieri, fallito.


    Codice PHP:
    int ThreadCallingLoopProcedure (void data)
    {
    //crea un mutex per evitare conflitti con letture di SDL_Event message; da parte del thread e di altre funzioni
    LoopProcedureMutex SDL_CreateMutex();
    SDL_LockMutex(LoopProcedureMutex);

    //informazioni per il debug
    cout << "Starting ThreadCallingLoopProcedure pointing to " << data << endl;

    //viene passato come argomento A SDL_CreateThread(ThreadCallingLoopProcedure ,this)
    fe::window object = (fe::window *)data;

    //questa funzione, setta una procedura predefinita che processa alcuni semplici messaggi
    object->SetMainLoop(PredefiniteLoopProcedure);
    SDL_UnlockMutex(LoopProcedureMutex);

    int ReturnValue 1;
    do
        {
            
    //verifica eventi e se ce ne sono chiama CallLoopProcedure, che è un metodo della classe che invia alla procedura l'evento da proccessare
        
    if( SDL_PollEvent(object->ReadMessage()) ) //<- qui mi da errore di run time perché ritorna un puntatore a membro privato e non ci sono i permessi necessari 
            
    ReturnValue object->CallLoopProcedure();
        else    
    //equivalente a Sleep(5);
            
    SDL_Delay(5);

        }
    //read message semplicemente ritorna un puntatore alla struttura eventi, e se messaggio->type == SDL_QUIT, chiude la procedura
    while(object->ReadMessage()->type != SDL_QUIT || ReturnValue == 0);

    //chiama esplicitamente il distruttore
    object->close();

    //informazioni per il debug
    SDL_LockMutex(LoopProcedureMutex);
    cout << "Ending ThreadCallingLoopProcedure pointing to " << data << endl;
    SDL_UnlockMutex(LoopProcedureMutex);

    //fine 
    return 0;


    CHe ne pensate???

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.