[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