Newsgroup: it.comp.programmare.win32
Titolo: Problema con Threads!!!

Ciao,
ho un problema con un'applicazione MFC che dovrebbe generare un nuovo
thread:
Compilando con VC++ 6, sulla seguente istruzione si genera un errore;
{
        // Start the thread
        m_pThread[nIndex] = AfxBeginThread(ThreadFunc,
(LPVOID)&m_cSpin[iSpnr], iPriority);
}
L'errore è il seguente:
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert
parameter 1 from type 'unsigned int (void *)'
L'interfaccia della mia funzione "ThreadFunc" è la seguente:
UINT ThreadFunc(LPVOID pParam)
Non capisco l'errore. Dove sbaglio?
Andrea

 wrote in message
b3b11n$v2k$1...@lacerta.tiscalinet.it...

o sostituisci quel LPVOID con void* e poi quet'istruzione
(LPVOID)&m_cSpin[iSpnr]
diventa
(LPVOID oppure void*)&(m_cSpin[iSpnr])
prova un pò
ciao
JoGiò

 wrote in message
news:b3b11n$v2k$1...@lacerta.tiscalinet.it...

Le funzioni di thread devono restituire un void non uint
ciao

 Le funzioni di thread devono restituire un void non uint
Ho provato a far restituire un void invece che un UINT, ma ora mi dà il
seguente errore:
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert
parameter 1 from type 'void (void *)'
A proposito, il parametro 1 di una funzione è il primo argomento, giusto?
Se è così, ti riporto le due firme della funzione AfxBeginThread:
1.  CWinThread* AfxBeginMessage (CRunTimeClass* pTClass, int nPriority, ...
, ...
2.  CWinThread* AfxBeginMessage (AFX_THREADPROC atProc, LPVOID pParam, int
nPriority, ... , ...
Ora, io utilizzo la seconda, e, a quanto pare, il compilatore non riesce a
convertire AFX_THREADPROC da UINT o da void.
Qualche consiglio?
Grazie!
Andrea

 Le funzioni di thread devono restituire un void non uint
Ti sbagli, le funzioni dei thread in MFC devono avere tale firma:
UINT MyThreadFunction( LPVOID pParam );
--
  Jerle Shannara
Per rispondere in email togli JERLEANTISPAM
homepage 
http://utenti.lycos.it/jerleshannara


Non capisco, dovrebbe poter funzionare...
Ammesso che gli altri parametri siano giusti, non è che la tua funzione
ThreadFunc è una funzione membro? Se così non è, al limite prova a farne il
cast:
m_pThread[nIndex] = AfxBeginThread((AFX_THREADPROC)ThreadFunc,
(LPVOID)&m_cSpin[iSpnr], iPriority);


 (LPVOID)&m_cSpin[iSpnr], iPriority);
ThreadFunc è una funzione membro. Ho provato a fare i cast e questo è il
risultato:
error C2440: 'type cast' : cannot convert from '' to 'unsigned int (__cdecl
*)(void *)'
        None of the functions with this name in scope match the target type
Cioè, mi dice che nono può convertire da '' a 'unsigned int (__cdecl *)(void
*)'  !!!!
Ma cosa significa questo   ''   ???
Cmq, il codice originario l'ho copiato da un libro, quindi dovrebbe essere
corretto. Non riesco a capire... non è che devo includere qualche libreria,
oopure la funzione ThreadFunc deve essere public??? Ho provato, ma nisba...
Andrea


La funzione del thread può essere una funzione globale o una funzione membro
static.
Non può essere una qualsiasi funzione membro non static per l'impossibilità
di gestire il contesto della classe.
Per inciso non credo sia possibilie fare il cast di una funzione membro a
funzione non membro.
Porlock

 funzione non membro.
Risolto il mistero! ThreadFunc deve essere una funzione static. Del resto
tale funzione è il main relativo al rispettivo thread.
Ti ringrazio tanto!
Andrea