[C con Clase] hilos en C

Steven Richard Davidson stevenrichard.davidson en gmail.com
Vie Nov 9 06:14:45 CET 2007


Hola rnapoles,

On 11/7/07, rnapoles en ipihlg.rimed.cu <rnapoles en ipihlg.rimed.cu> wrote:
> Salu2
> lista el código que muestro a continuación enumera todos los recursos
> compartidos que hay en la red pero
> se tarda demasiado para realizar dicha tarea.  He intentado  agregarle
> la  capacidad de crear múltiples hilos
> para que lo haga mas rápido pero no consigo hacerlo funcionar
> correctamente. El problema es que los hilos
> que creo me van mostrando el mismo recurso y lo que deseo es que si el
> hilo1 esta escaneando la PC-1 el
> segundo pase a la PC-2 no que escanee la 1 de nuevo. No se si me hago
> entender ,perdonen  mi desconocimiento en este tema. Ah otra pregunta si

Esto es normal, porque simplemente has creado dos hilos diferentes que
ejecutan la misma función y por consiguiente no es de extrañar que
obtengas la misma información.

Lo que debes hacer es crear otros hilos a medida que los vayas
necesitando. En lugar de usar una recursividad directa invocando
'doEnum()', lo hacemos indirectamente a través de 'ClientThread()'.
Sin embargo, llegamos a otro problema. El puntero de la función a
pasar como parámetro a 'CreateThread()' sigue este prototipo:

DWORD WINAPI ThreadProc(
  LPVOID lpParametro   // parámetros para el hilo
);

Esto te conviene porque cada invocación a 'ClientThread()' puede
contener la información necesaria para invocar 'doEnum()'
correctamente. Por ejemplo,

struct INFO_HILO
{
  int nNivel;
  NETRESOURCE nrInfo;
};

DWORD WINAPI ClientThread( LPVOID lpParam )
{
  INFO_HILO ihDatos = * ((INFO_HILO *) lpParam);

  doEnum( ihDatos.nNivel, &ihDatos.nrInfo );
}

int doEnum( int level, NETRESOURCE *pnr )
{
  ...
  if ( buf[ui].dwUsage & RESOURCEUSAGE_CONTAINER )
  {
    INFO_HILO ihDatos = {...};
    CreateThread( ... );
  }
  ...
}

En lugar de invocar 'doEnum()' directamente, creamos otro hilo con
'CreateThread()' y en su función particular, 'ClientThread()', se
invocará 'doEnum()' con la información correcta.

> al crear un  hilo  el  proceso que lo creo finaliza este termina también;
>

Al menos en MS-Window, sí. Una vez que un proceso termine, casi todos
sus recursos son terminados, cerrados, y/o eliminados. Sin embargo, no
se termina automáticamente los procesos hijos de un proceso pariente
que ha terminado. Por lo tanto, los hilos creados por cualesquier
procesos hijos existentes no son terminados, aunque el proceso
pariente sí lo haya hecho.


Espero que todo esto te sirva.

Steven




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