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

    [VC++] Aiuto su multihreading

    salve!!
    sto creando una piccola applicazione console con VC++.
    vorrei implementare un piccolo server socket (più per scopi didattici che altro).
    ho creato una classe con dentro questa funzione:
    codice:
    UINT Server::initConnection(LPVOID param) {
       ...................
    }
    ho cercato un pò in giro e ho visto degli esempi con AfxBeginThread.
    ho provato così:
    codice:
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
    
    	HMODULE hModule = ::GetModuleHandle(NULL);
    
    	if (hModule != NULL)
    	{
    		// inizializza MFC e visualizza un messaggio in caso di errore
    		if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
    		{
    			// TODO: modificare il codice di errore in base alle esigenze
    			_tprintf(_T("Errore irreversibile: inizializzazione di MFC non riuscita\n"));
    			nRetCode = 1;
    		}
    		else
    		{
    			cout << "PRESS ENTER TO EXIT" << endl;
    			AfxBeginThread(Server::initConnection, 0);
    			while(_getch() != 27);
    		}
    	}
    	else
    	{
    		// TODO: modificare il codice di errore in base alle esigenze.
    		_tprintf(_T("Errore irreversibile: GetModuleHandle non riuscito\n"));
    		nRetCode = 1;
    	}
    
    	return nRetCode;
    }
    ma ottengo un errore su AfxBeginThread:
    error C3867: '&Server::initConnection': chiamata di funzione senza elenco di argomenti; utilizzare 'Server::initConnection' per creare un puntatore al membro
    [/code]
    un aiuto??

  2. #2
    AfxBeginThread (come CreateThread e praticamente ogni altra funzione di creazione thread pensata per il C) si aspetta un puntatore a funzione, mentre tu gli vorresti passare un metodo di istanza, cosa non possibile fondamentalmente per due motivi:
    - i metodi d'istanza usano una convenzione di chiamata diversa;
    - quando crei un callback ad un metodo d'istanza normalmente quello che vorresti non è solo passare l'indirizzo del metodo, ma anche l'istanza dell'oggetto su cui farlo lavorare (il suo "this") - ovvero, una coppia puntatore a funzione+puntatore ad oggetto che ovviamente non ci sta in un parametro che è semplicemente un puntatore ad oggetto.

    Il modo più semplice per risolvere è usare come entrypoint del thread una funzione "normale" (o al limite un metodo statico della classe Server, anche se non so se è ammesso dallo standard) che riceve il puntatore all'oggetto Server e chiama la initConnection:
    codice:
    UINT initConnectionThreadFunc(LPVOID param) {
        Server * obj = static_cast<Server *>(param);
        return obj->initConnection();
    }
    
    ...
        AfxBeginThread(initConnectionThreadFunc, (LPVOID) &oggettoServer);
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    ok grazie così funziona.
    devo un attimo studiarmi la cosa per capirci un pò meglio.

    già che ci sono chiedo una cosa inerente.
    conosco un pò la programmazione multi-threading in altri linguaggi.
    nn sul c++.
    AfxBeginThread mi garantisce che ogni connessione effettuata venga eseguita su un thread separato??

  4. #4
    Originariamente inviato da fermat
    conosco un pò la programmazione multi-threading in altri linguaggi.
    nn sul c++.
    Tieni conto che in C++ non c'è un supporto standard per la gestione dei thread (o meglio, è stato introdotto solo nello standard approvato quest'anno), per cui la gestione dei thread, i meccanismi di sincronizzazione, ... variano a seconda della piattaforma/libreria che usi.
    AfxBeginThread mi garantisce che ogni connessione effettuata venga eseguita su un thread separato??
    Sì.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    perfetto.
    grazie mille per l'aiuto!!

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.