elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  pasar argumentos por un CreateThread?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: pasar argumentos por un CreateThread?  (Leído 9,060 veces)
while

Desconectado Desconectado

Mensajes: 24


Ver Perfil
pasar argumentos por un CreateThread?
« en: 13 Octubre 2010, 23:30 pm »

Así es como venía usandolos:

unsigned long __stdcall mithread( void* pVoid )
{
...
}

CreateThread( 0, 0, &mithread, 0, 0, 0 );

El caso es que ahora necesito pasarle un argumento, algo así como:

unsigned long __stdcall mithread( void* pVoid, char* nombre )
{
...
}

CreateThread( 0, 0, &mithread, "asdf", 0, 0 );

Pero esta no es la forma correcta.
Alguien puede decirme como es?

Gracias!


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: pasar argumentos por un CreateThread?
« Respuesta #1 en: 14 Octubre 2010, 00:34 am »

Código
  1. unsigned long __stdcall mithread( void* pVoid)
  2. {
  3. char *nombre = (char*)pVoid;
  4. ...
  5.  

Usando ese misma logica podes pasar el puntero a una estructura con diferentes campos.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
while

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: pasar argumentos por un CreateThread?
« Respuesta #2 en: 14 Octubre 2010, 01:30 am »

ah claro, no había caido.

Muchas gracias eternal idol.


Una pregunta mas, puedo pasar otro argumento mas por el CreateThread?

algo asi como:
unsigned long __stdcall mithread( void* pVoid, void* pVoid2)

CreateThread( 0, 0, &mithread, "asdf1", "asdf2", 0 );


Gracias de nuevo.
« Última modificación: 14 Octubre 2010, 01:51 am por while » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: pasar argumentos por un CreateThread?
« Respuesta #3 en: 14 Octubre 2010, 02:18 am »

No:
http://msdn.microsoft.com/en-us/library/ms682453%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms686736%28v=VS.85%29.aspx

Solo se pasa y recibe un parametro PERO como te dije antes podes usar un puntero a una estructura muy facilmente.

Código
  1. typedef struct _Params
  2. {
  3.  char *fstr;
  4.  char *sstr;
  5. }Params, *PParams;
  6.  
  7. unsigned long __stdcall mithread( void* pVoid)
  8. {
  9.  PParams params = (PParams)pVoid;
  10.  params->fstr;
  11.  params->sstr;
  12.  ...
  13. }
  14.  
  15. ...
  16. Params params;
  17. params.fstr = "asdf1";
  18. params.sstr = "asdf";
  19. CreateThread( 0, 0, &mithread, &params, 0, 0 );

No comprobe el codigo, es tarde, pero seguro te podes hacer una idea con el.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
while

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: pasar argumentos por un CreateThread?
« Respuesta #4 en: 14 Octubre 2010, 03:06 am »

Hola, buena idea para pasarlos, pero debe haber algo mal, y no veo que es:
PParams params = (PParams)pVoid;
MessageBox(0,params->arga,"Title",MB_OK);
MessageBox(0,params->argb,"Title",MB_OK);

estos devuelven simbolos raros, y no el texto que les he pasado.

Gracias de nuevo
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: pasar argumentos por un CreateThread?
« Respuesta #5 en: 14 Octubre 2010, 09:31 am »

No se como habras hecho pero esto ya funciona:

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. typedef struct _Params
  5. {
  6.  char *fstr;
  7.  char *sstr;
  8. }Params, *PParams;
  9.  
  10. unsigned long __stdcall mithread( void* pVoid)
  11. {
  12.  PParams params = (PParams)pVoid;
  13.  MessageBox(0, params->fstr, "Title",MB_OK);
  14.  MessageBox(0, params->sstr, "Title",MB_OK);
  15.  return 0;
  16. }
  17.  
  18. void main()
  19. {
  20.  Params params;
  21.  params.fstr = "asdf1";
  22.  params.sstr = "asdf2";
  23.  
  24.  CreateThread( 0, 0, &mithread, &params, 0, 0 );
  25.  getchar();
  26. }
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
while

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: pasar argumentos por un CreateThread?
« Respuesta #6 en: 14 Octubre 2010, 13:23 pm »

Si lo compilo en una aplicación de consola me funciona, pero luego en la dll, mira que me devuelve:
« Última modificación: 14 Octubre 2010, 13:25 pm por while » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: pasar argumentos por un CreateThread?
« Respuesta #7 en: 14 Octubre 2010, 13:53 pm »

Depuralo para ver que pasas y recibis; depende del codigo pero si estas pasando una estructura que esta en la pila y la funcion retorna ya no es confiable el puntero.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
while

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: pasar argumentos por un CreateThread?
« Respuesta #8 en: 14 Octubre 2010, 14:28 pm »

y podria pasar algo asi como:
char *array_parametros[] = {
"asdf1",
"asdf2"
};
?

Si no, supongo que podria hacer una función intermedia que cree el thread
CrearThread("asdf1","asdf2");

y luego en CrearThread()
Concatenar asdf1 y asdf2 separados por un caracter como
asdf1§asdf2 y pasarlos por el create thread como un unico parametro, y luego que el thread los separe y los meta en su correspondiente variable.
Que te parece esto último?

Saludos, y gracias de nuevo
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: pasar argumentos por un CreateThread?
« Respuesta #9 en: 14 Octubre 2010, 15:03 pm »

Podrias, no hay diferencia en teoria, array_parametros podria desaparecer de su ambito y apuntar a cualquier lado sus elementos, lo que si podes hacer es usar una variable global ... depende del codigo, hay varias alternativas.

Lo ultimo me parece una solucion rebuscada y poco fiable.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines