Ejemplo n.º 1
0
void FileDialogButtonWidget::OnClicked( const Inspect::FileDialogButtonClickedArgs& args )
{
    HELIUM_ASSERT( m_ButtonWindow );

    long windowStyle = 0;
    switch ( args.m_Type )
    {
    case Inspect::FileDialogTypes::OpenFile:
        windowStyle = wxFD_OPEN;
        break;
    case Inspect::FileDialogTypes::SaveFile:
        windowStyle = wxFD_SAVE;
        break;
    default:
        HELIUM_BREAK();
        break;
    }

    Path path;
    wxFileDialog fileDialog( m_ButtonWindow->GetParent(), args.m_Caption.c_str(), args.m_StartPath.Directory().c_str(), args.m_StartPath.Filename().c_str(), args.m_Filter.c_str(), windowStyle );
    if ( fileDialog.ShowModal() == wxID_OK )
    {
        path.Set( static_cast<const tchar*>( fileDialog.GetPath().c_str() ) );
    }

    args.m_Result = path;
}
Ejemplo n.º 2
0
// Implementacion el proceso administrador
void Coordinator()
{
    // Permite guardar el estado.
    MPI_Status status;
    // Permite almacenar el mensaje a ser intercambiado.
    Message message;

    // Permite mantener registro de todos los procesos esperando por una ruta.
    int* waiting = new int[NumberOfProcesses];
    // Permite almacenar la cantidad de procesos esperando.
    int numberOfWaitingProcesses = 0;
    // Cuenta el número de mejores rutas recibidas.
    int numberOfBestPath = 0;

    // Permite almacenar la ruta más corta encontrada hasta ahora.
    Path Shortest;
    // Permite almacenar las tareas a ser asignadas en una cola.
    List queue;
    // Instanciamos una nueva ruta.
    Path *P = new Path;
    // Inserta la primera ruta, la de largo 0.
    queue.Insert(P, 0);

    // La ruta inicial debe ser mala.
    Shortest.length = INT_MAX;
    // Mientras los procesos que esperan por asignacion de algun ruta sean menores a la cantidad total menos 1
    while (numberOfWaitingProcesses < NumberOfProcesses - 1)
    {
        // Se reciben los mensajes enviados por los trabajadores
        MPI_Recv (&message, MessageSize, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

        // Se revisa el status
        switch (status.MPI_TAG)
        {
        // Si es una ruta mejor la que se envia
        case BestPathTag:
            // Si el largo de la ruta es menor que el de la menor encontrada hasta ahora
            if (message.length < Shortest.length)
            {
                numberOfBestPath++;
                printf("Mejor Ruta encontrada %d, origen = %d, largo = %d\n",
                       numberOfBestPath, status.MPI_SOURCE, message.length);

                // actualizar la ruta mas corta
                Shortest.Set(message.length, message.city, NumberOfCities);
                // Le envio la nueva ruta a los trabajadores
                for(int i = 1; i < NumberOfProcesses; i++)
                    MPI_Send(&(Shortest.length), 1, MPI_INT, i, UpdateBestPathTag, MPI_COMM_WORLD );
            }
            break;
        // Si hay que insertar una ruta en la cola de tareas
        case PutPathTag:
            // Si hay procesos esperando por tareas
            if (numberOfWaitingProcesses > 0)
            {
                // no se pone la ruta en la cola, se envia al proceso en espera
                MPI_Send (&message, MessageSize, MPI_INT, waiting[--numberOfWaitingProcesses], ReplyPathTag, MPI_COMM_WORLD);
            }
            else // si no hay procesos en espera de tareas
            {
                // sea crea una nueva ruta
                P = new Path();
                // se configuran sus valores
                P->Set(message.length, message.city, message.visited);
                // se inserta en la cola de tareas
                queue.Insert(P, message.length);
            }
            break;
        // Si hay que asignar una tarea.
        case GetPathTag:
            // si aun hay rutas en la cola de tareas.
            if (!queue.IsEmpty())
            {
                // se obtiene la ruta y se la envia con la mejor longitud
                P = (Path *)queue.Remove(NULL);
                message.length = P->length;
                memcpy(message.city, P->city, MAXCITIES*sizeof(int));
                message.visited = P->visited;
                MPI_Send (&message, MessageSize, MPI_INT, status.MPI_SOURCE, ReplyPathTag, MPI_COMM_WORLD);
                delete P;
            }
            else
            {
                // El proceso que pidio la ruta debe esperar
                waiting[numberOfWaitingProcesses++] = status.MPI_SOURCE;
                if (numberOfWaitingProcesses == NumberOfProcesses - 1)
                    // se les comunica a los demás procesos que se terminó
                    for (int i = 1; i < NumberOfProcesses; i++)
                        MPI_Send (NULL, 0, MPI_INT, i, DoneTag, MPI_COMM_WORLD);
            }
            break;
        }
    }
    // Se imprime la ruta más corta.
    printf("La Ruta Mas Corta Es : \n");
    Shortest.Print();
}