Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

random y Thread

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: random y Thread Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.