Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: while en 13 Octubre 2010, 23:30 PM

Título: pasar argumentos por un CreateThread?
Publicado por: while 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!
Título: Re: pasar argumentos por un CreateThread?
Publicado por: Eternal Idol en 14 Octubre 2010, 00:34 AM
unsigned long __stdcall mithread( void* pVoid)
{
char *nombre = (char*)pVoid;
...


Usando ese misma logica podes pasar el puntero a una estructura con diferentes campos.
Título: Re: pasar argumentos por un CreateThread?
Publicado por: while 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.
Título: Re: pasar argumentos por un CreateThread?
Publicado por: Eternal Idol 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 (cpp) [Seleccionar]

typedef struct _Params
{
  char *fstr;
  char *sstr;
}Params, *PParams;

unsigned long __stdcall mithread( void* pVoid)
{
  PParams params = (PParams)pVoid;
  params->fstr;
  params->sstr;
  ...
}

...
Params params;
params.fstr = "asdf1";
params.sstr = "asdf";
CreateThread( 0, 0, &mithread, &params, 0, 0 );


No comprobe el codigo, es tarde, pero seguro te podes hacer una idea con el.
Título: Re: pasar argumentos por un CreateThread?
Publicado por: while 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
Título: Re: pasar argumentos por un CreateThread?
Publicado por: Eternal Idol en 14 Octubre 2010, 09:31 AM
No se como habras hecho pero esto ya funciona:

Código (cpp) [Seleccionar]
#include <windows.h>
#include <stdio.h>

typedef struct _Params
{
  char *fstr;
  char *sstr;
}Params, *PParams;

unsigned long __stdcall mithread( void* pVoid)
{
  PParams params = (PParams)pVoid;
  MessageBox(0, params->fstr, "Title",MB_OK);
  MessageBox(0, params->sstr, "Title",MB_OK);
  return 0;
}

void main()
{
  Params params;
  params.fstr = "asdf1";
  params.sstr = "asdf2";

  CreateThread( 0, 0, &mithread, &params, 0, 0 );
  getchar();
}
Título: Re: pasar argumentos por un CreateThread?
Publicado por: while 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:
(http://img832.imageshack.us/img832/7670/asdfqi.png)
Título: Re: pasar argumentos por un CreateThread?
Publicado por: Eternal Idol 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.
Título: Re: pasar argumentos por un CreateThread?
Publicado por: while 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
Título: Re: pasar argumentos por un CreateThread?
Publicado por: Eternal Idol 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.
Título: Re: pasar argumentos por un CreateThread?
Publicado por: while en 14 Octubre 2010, 22:42 PM
He probado la última opción y tengo algunos problemas al concatenar y pasar por el thread:

FuncionLlamarThread("asdfA","asdfB");


...


void FuncionLlamarThread(char *a1, char *a2)
{
char finaldefinido[50];
sprintf(finaldefinido, "%s-%s", a1, a2);

char *final = finaldefinido;
MessageBox(0, final, "Title",MB_OK); // Funciona, por lo que aparentemente se han concatenado.

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

Pero luego el mithread, el messagebox aparece en blanco al hacer:
char *nombre = (char*)pVoid;
MessageBox(0, nombre, "Title",MB_OK);
Título: Re: pasar argumentos por un CreateThread?
Publicado por: Eternal Idol en 14 Octubre 2010, 23:41 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."

"... podria desaparecer de su ambito ..."

void FuncionLlamarThread(char *a1, char *a2)
{
char finaldefinido[50];
...
}

Tu cadena esta en la pila y su ambito es local a la funcion.