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; }
// 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(); }