[C con Clase] hilos en C

rnapoles en ipihlg.rimed.cu rnapoles en ipihlg.rimed.cu
Jue Nov 8 00:05:35 CET 2007


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 
al crear un  hilo  el  proceso que lo creo finaliza este termina también;

gracias de antemano

//añadir compilar con Dev-cpp y añadir libmpr.a

#include <stdio.h>
#include <windows.h>

int main( void );
int doEnum( int level, NETRESOURCE *pnr );
void exterr( void );



void exterr( void )
{
        char errbuf[2048], namebuf[2048];
        DWORD err;

        errbuf[0] = namebuf[0] = '\0';
        if ( WNetGetLastError( &err, errbuf, sizeof errbuf, namebuf, 
sizeof namebuf ) == NO_ERROR )
                printf( "Error %lu (\"%s\") reported by \"%s\".\n",
                        err, errbuf, namebuf );
        return;
}


int doEnum( int level, NETRESOURCE *pnr )
{
        DWORD rc, rc2;
        HANDLE hEnum;
        DWORD count, bufsize, ui;
        NETRESOURCE buf[200];
        const char *type, *cont;

        rc = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, pnr, 
&hEnum );
        if ( rc == ERROR_ACCESS_DENIED )
        {
                printf( "%-6.6s %-4.4s%*s  Error 5 -- acceso 
denegado\n", "", "", level * 2, "" );
                return 1;
        }

        if ( rc )
        {
                printf( "WNOE(): rc = %lu, gle = %lu\n", rc, rc2 = 
GetLastError() );
                if ( rc2 == ERROR_EXTENDED_ERROR )
                        exterr();
                return 0;
        }

        while ( 1 )
        {
                count = (DWORD) -1L;
                bufsize = sizeof buf;
                rc = WNetEnumResource( hEnum, &count, buf, &bufsize );
                if ( rc != NO_ERROR )
                        break;
                for ( ui = 0; ui < count; ++ ui )
                {
                        switch ( buf[ui].dwDisplayType )
                        {
                                case RESOURCEDISPLAYTYPE_DOMAIN:
                                        type = "domain"; break;
                                case RESOURCEDISPLAYTYPE_GENERIC:
                                        type = "generic"; break;
                                case RESOURCEDISPLAYTYPE_SERVER:
                                        type = "server"; break;
                                case RESOURCEDISPLAYTYPE_SHARE:
                                        type = "share"; break;
                                default:
                                        type = "unknown"; break;
                        }
                        cont = ( buf[ui].dwUsage & 
RESOURCEUSAGE_CONTAINER )? "container": "";
                        printf( "%-6.6s %-4.4s%*s  %s \n", type, cont, 
level * 2, "",
                                buf[ui].lpRemoteName );
                             
                       
                       if ( buf[ui].dwUsage & RESOURCEUSAGE_CONTAINER )
                                doEnum( level + 1, &buf[ui] );
                }
        }

        if ( rc != ERROR_NO_MORE_ITEMS ) // bad things
        {
                printf( "WNER(): rc = %lu, gle = %lu\n", rc, rc2 = 
GetLastError() );
                if ( rc2 == ERROR_EXTENDED_ERROR )
                        exterr();
        }

        WNetCloseEnum( hEnum );
        return 1;
}

DWORD WINAPI ClientThread()
{


doEnum( 0, NULL );
      
}

int main( void )
{
HANDLE        hThread;
DWORD         dwThreadId; 

HANDLE        hThread1;
DWORD         dwThreadId1; 

 hThread = CreateThread(NULL, 0, ClientThread,
                    0, 0, &dwThreadId);
        if (hThread == NULL)
        {
            printf(" Error en CreateThread()  %d\n", GetLastError());
           
        }

  hThread1 = CreateThread(NULL, 0, ClientThread,
                    0, 0, &dwThreadId1);
        if (hThread1== NULL)
        {
            printf(" Error en CreateThread()  %d\n", GetLastError());
           
        }

//WaitForSingleObject(hThread,INFINITE);

        return 0;
}




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