| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
dan Ens

Registrado: 17 May 2006Mensajes: 43
|
Publicado: Vie 21 Sep, 2007 1:31 am Asunto: random y Thread |
|
|
Hola a todos...
Estoy haciendo varios hilos, y en cada uno quiero generar números aleatorios para cada proceso independiente, pero cuando utilizo el random, todos los hilos escogen el mismo número. ¿Cómo uso el random con varios hilos?
Gracias... |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 21 Sep, 2007 8:00 am Asunto: |
|
|
Antes de lanzar la función random con el índice que te interese, tienes que inicializar el sistema. En la ayuda de la función viene el ejemplo:
| Código: | #include <stdlib>
#include <stdio>
#include <time>
/* prints a random number in the range 0 to 99 */
int main(void)
{
randomize();
printf("Random number in the 0-99 range: %d\n", random (100));
return 0;
} |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
dan Ens

Registrado: 17 May 2006Mensajes: 43
|
Publicado: Vie 21 Sep, 2007 5:59 pm Asunto: |
|
|
| Inicialicé con el "randomize" antes de lanzar la creación de los hilos y nada, todos los hilos escogen el mismo número... |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Sab 22 Sep, 2007 7:18 am Asunto: |
|
|
¿Y en lugar de tratar de establecer un número aleatorio por qué no lo haces con un contador?
A mi, el ejemplo de la ayuda me funciona. Ahora bien, no sé como lo haces tú. Cuano dices que repite el mismo numero para cada hilo ¿es qué lanzas el programa de nuevo o son eventos diferentes de la misma ejecución? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
dan Ens

Registrado: 17 May 2006Mensajes: 43
|
Publicado: Lun 24 Sep, 2007 6:37 pm Asunto: |
|
|
Estoy colocando el random en el cuerpo de cada hilo (en la funcion execute), la ejecución es una sola, con varios hilos y cada hilo debe generar un numero aleatorio diferente al numero de los demás hilos.
Y no puedo utilizar un contador, necesito numeros aleatorios... |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 24 Sep, 2007 10:39 pm Asunto: |
|
|
Hola dan:
Crea una función miembro de tu clase Thread sin argumentos. Y dentro de ella haz las operaciones que necesites con "random". Si necesitas ese valor fuera de la función declara una variable privada y la rellenas ahí..:
| Código: | class TMiThread : public TThread
{
private:
int x;
void __fastcall UpdateRandom();
//...
|
| Código: | void __fastcall TMiThread::UpdateRandom()
{
x = random(1000);
} |
Y ahora para llamar a esta función utiliza "Synchronize" del siguiente modo:
| Código: | void __fastcall TMiThread::Execute()
{
//...
while (!Terminated)
{
//...
Synchronize(UpdateRandom);
// Usamos "x" que contiene el valor aleatorio
//...
}
} |
IMPORTANTE: Utiliza "randomize" solo una vez y fuera de Thread. |
|
| Volver arriba |
|
 |
dan Ens

Registrado: 17 May 2006Mensajes: 43
|
Publicado: Lun 24 Sep, 2007 11:37 pm Asunto: |
|
|
Hola _Leo.
He hecho exactamente lo que me has dicho, pero no funciona, los hilos se quedan bloqueados cuando entran en la función "Synchronize(UpdateRandom);", quité el "while(!Terminated)", pero nada...
Estuve leyendo sobre Synchronize y no lo puedo usar, ya que el hilo principal está bloqueado porque está a la espera de los resultados de los hilos... |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 25 Sep, 2007 12:37 am Asunto: |
|
|
| dan escribió: | | los hilos se quedan bloqueados cuando entran en la función "Synchronize |
La forma en que funciona "Synchronize" es enviando un mensaje al hilo principal para que sea este quien ejecute esta función en cuanto pueda, si tienes algún bucle que impida que se procese la cola de mensajes se quedara esperando la respuesta de este mensaje. En caso de que sea este el caso, prueba añadiendo la siguiente línea dentro de ese bucle para que se procese la cola de mensajes:
| Código: | Application->ProcessMessages(); |
Otra solución, es que uses las funciones "Randomize()" (R mayuscula) y "RandomRange(0, 999)" en lugar de random. Para poder usarlas recuerda añadir la cabecera correspondiente: #include <math.hpp> |
|
| Volver arriba |
|
 |
dan Ens

Registrado: 17 May 2006Mensajes: 43
|
Publicado: Mar 25 Sep, 2007 1:28 am Asunto: |
|
|
He colocado Application->ProcessMessages(); dentro del while que espera los hilos así:
lista aux=d_param;
while(aux!=NULL){
Application->ProcessMessages();
WaitForSingleObject(aux->id_hilo,INFINITE);
aux=aux->sig;
}
y no hace nada, igual se bloquean los hilos.
En cuanto a RandomRange, tengo la librería math.hpp, pero allí no se encuentra dicha función, no se si sea por la versión. (C++ Builder 4.0)... |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 25 Sep, 2007 2:25 am Asunto: |
|
|
| dan escribió: | | En cuanto a RandomRange, tengo la librería math.hpp, pero allí no se encuentra dicha función, no se si sea por la versión. (C++ Builder 4.0)... |
Efectivamente, en el BCB4 no existe esa función, con seguridad existe a partir del BCB6 (no se si en la 5 también).
Prueba cambiando las líneas:
| Código: | Application->ProcessMessages();
WaitForSingleObject(aux->id_hilo,INFINITE); |
por lo siguiente:
| Código: | while (WAIT_TIMEOUT == WaitForSingleObject(aux->id_hilo, 100))
Application->ProcessMessages(); |
(Para que funcione "aux->id_hilo" debe ser un HANDLE valido de algún hilo)
En caso de que te siga sin funcionar y si el proyecto no es muy grande si quieres puedo echarle un vistazo, mi email es:
leosoftware ARROBA gmail PUNTO com |
|
| Volver arriba |
|
 |
|