[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