[C con Clase] Duda sobre CreateThread

Steven R. Davidson vze266ft en verizon.net
Sab Mar 1 03:18:49 CET 2008


Hola Antonio,

Antonio Escalante wrote:
>  
> Buenas,
>  
> Una pregunta sobre hilos. Alguien me podria decir como especifico en 
> createthread para pasar como parametro el hwnd de la ventana principal o 
> bien como se accede desde el procedimiento del hilo al hwnd sin pasarlo 
> como parametro? como quedaria el prototipo de la funcion del hilo? 
>  

Ten presente que el prototipo de la función que pasas a 'CreateThread()' 
acepta un puntero genérico como su parámetro, el cual debes pasar a la 
función 'CreateThread()'. Por ejemplo,

DWORD WINAPI FuncHilo( LPVOID param )
{
   HWND hPrincipal = *((HWND *)param);
   ...
}
...
DWORD dwID;
HANDLE hHilo = CreateThread( 0, 0, FuncHilo, &hwnd, CREATE_SUSPENDED, 
&dwID );

También podemos guardar el manipulador de la ventana principal en una 
variable global, y así puede ser accedida por la función 'FuncHilo()'. 
Por ejemplo,

HWND g_hPrincipal;
...
DWORD WINAPI FuncHilo( LPVOID param )
{
   // Usamos 'g_hPrincipal' para manipular la ventana principal
   ...
}
...
g_hPrincipal = hwnd;
DWORD dwID;
HANDLE hHilo = CreateThread( 0, 0, FuncHilo, 0, CREATE_SUSPENDED, &dwID );


Para programas más complejos, podríamos usar el TLS (Almacenamiento 
Local del Hilo) de los hilos y guardar el manipulador de ventana en tal 
memoria local. Sin embargo, tendríamos que pasar el índice a este búfer 
local de memoria a la función del hilo. Por ejemplo,

DWORD WINAPI FuncHilo( LPVOID param )
{
   HWND hPrincipal = *TlsGetValue( *((DWORD *)param) );
   ...
}


DWORD dwIndice = TlsAlloc();
HWND *pPrincipal = new HWND;
*pPrincipal = hPrincipal;

TlsSetValue( dwIndice, pPrincipal );
...
DWORD dwID;
HANDLE hHilo = CreateThread( 0, 0, FuncHilo, &dwIndice,
                              CREATE_SUSPENDED, &dwID );
...
delete pPrincipal;
TlsFree( dwIndice );


Espero que esto te sirva.

Steven






Más información sobre la lista de distribución Cconclase