Saltar al contenido

Imposibilidad de Representar datos en tablas según los algoritmos de ejecucón de procesos


Recommended Posts

Hola a todos

En la asignatura de Programación de Servicios y Procesos, me piden representar en unas tablas los tiempos de ejecución de los procesos, los tiempos de espera y el orden de llegada.

Se me ocurrió intentar hacerlo, pero programado en vba. Lamentablmente, me pasa como en mis anteriores proyectos, lo imagino, pero no logro llevarlo a la práctica.

Tengo una matriz, donde meto los datos de los procesos:

Orden de llegada ordenados por número de proceso del 1 al 9 y que identifican cada proceso en una fila diferente.

Tiempo de llegada, que será la celda desde donde se comenzará a ejecutar el proceso, o sea, si llega en 3 milisegundos, empezará a ejecutarse en la tercera celda de la tabla

Tiempo de ejecución, que serán  los milisegundos que se estarán ejecutando, representados por una "E", que se escribirá desde la celda de llegada el número de celdas que represente dicho tiempo. O sea, si tiene 3 de tiempo de llegada y 6 de tiempo de ejecución, se escribirán seis "E", desde la celda 3, hasta la celda 9 y en la fila que corresponda el número del proceso

 

he conseguido hacerlo, si solo fuera un proceso y utilizamos una sola línea. Pero cuando ya intento incluir una línea por proceso e incluyo unos cuántos, me pierdo.

Lo he intentado con varios array, con varios for, con while. Pero no tengo aún los conocimientos que me permiten hacerlo funcionar.

He creado el array de los datos de entrada:

Dim A_Datos(1 To 3, 1 To 9)
Dim i As Integer, j As Integer
For i = 1 To 3
   For j = 1 To 9
      If ("E" & (j) <> " ") Then
         A_Datos(i, j) = Cells(5 + i, 5 + j).Value
      End If
   Next j
Next i

Luego he creado los array de las tablas donde representaría esos datos:

'Algoritmo FCFS (Primero en llegar, primero en servir
'Los procesos se ejecutan por orden de llegada y el resto se va poniendo a la cola
Dim A_Fifo(1 To 31, 1 To 9)
Dim fi As Integer, fj As Integer
For fi = 1 To 31
   For fj = 1 To 9
      A_Fifo(fi, fj) = Cells(17 + fi, 2 + fj).Value
   Next fj
Next fi

'Algoritmo SJF --> El más corto primero
'Se van ejecutando los procesos con menos tiempo de ejecución.
'Los demás se van poniendo a la cola y ejecutando los más cortos primero
Dim A_Sjf(1 To 31, 1 To 9)
Dim Si As Integer, Sj As Integer
For Si = 1 To 31
   For Sj = 1 To 9
      A_Sjf(Si, Sj) = Cells(30 + Si, 2 + Sj).Value
   Next Sj
Next Si

Pero lamentablemente, no se muy bien, como hacer ahora para que los datos del primer array, se escriban en las tablas de los arrays correspondientes

Estoy totalmente perdido

Alguien me podría hechar una mano ?

Muchas gracias

Procesos.xlsm

Enlace a comentario
Compartir con otras webs

@el_trasgu , ¿Por qué no subes tu fichero con un ejemplo hecho a mano (o dando indicaciones)? Con tu explicación no he conseguido entender qué necesitas. Además en tu macro solo llenas matrices, pero luego no pasas ningún dato a las tablas, así que es imposibke seguir el proceso

Enlace a comentario
Compartir con otras webs

A ver si logro explicarme mejor, los datos de entrada, están en la primera tabla de mi fichero, y recojo los datos con el primer array A_Datos.

Sería tipo al siguiente ejercicio, yo los procesos los he identificado con números en lugar de letras.

El primer proceso A si inicia en 0, o sea, en la celda B17, que se corresponde con A0 en la tabla de abajo. y tiene una duración de 3 milisegundos, de ahí las tres "E"

El segundo proceso B, se inicia en 1, sería la celda C18, se corresponde con B1 en la tabla de abajo. pero como se está ejecutando el proceso anterior, tiene que pasar al estado de listo, que se representa con L1.

Cuando se acaba de ejecutar el proceso A, se empezará a ejecutar éste segundo proceso B, que se iniciará en lugar del instante 1 (C18), en el instante 3 (E18), y tendrá una duración de 6 milisegundos, se ahí las 6 "E"

El tercer proceso C, llega en el milisegundo 3, que está ocupado por el proceso B, por lo tanto pasará al estado de listo (L1 - primer poceso en espera).

Se ejecutará en el instante 9 (Como ves, los instantes de ejecución, son la suma de los procesos ejecutados con anterioridad (el proceso A tardo 3 milisegundos en ejecutarse, el proceso B, tardó 6. 3 + 6 = 9. El tercer proceso C, a pesar de llegar en el instante 3, no se podrá ejecutar hasta el instante 9)

imagen.thumb.png.bfdd4be4d4efb7ed6a2e17bfda0a9e2c.png

En esta segunda imagen pongo otro tipo de algoritmo. Es el SJF

En él, los procesos, en lugar de ejecutarse por orden de llegada, se ejecutan por tiempo de ejecución más corto.

El proceso A tiene 3 milisegundos de ejecución. Al llegar al micro-procesador, no hay ningún proceso más en ejecución ni en espera, por lo que al llegar se ejecuta, tardando 3 milisegundos.

Mientras se está ejecutando el proceso A, entra el proceso B, que tardará 6 milisegundos en ejecutarse, pero como el micro está ocupado, pasa al estado de espera (Listo1)

Justo al tiempo de acabar de ejecutarse el proceso A, entra el proceso C, y aunque el proceso B está listo para ejecutarse y en espera, como éste proceso C, tiene un tiempo de ejecución más corto, 3, se ejecutará primero que el proceso B, y éste seguirá a la espera. Como ves en la gráfica, aún se ejecutan dos procesos más, en E y el D antes que el B.

imagen.thumb.png.9e78250018c53001ebec35be36516cb5.png

Espero haberme expllicado mejor en ésta ocasión, aunque la verdad es que a mi me ha costando entenderlo un rato largo, jeje

Un saludo y muchas gracias

 

 

Enlace a comentario
Compartir con otras webs

Y ahora entraría el siguiente algoritmo, el Round-Robin

Este lo que hace, es darle a cada tarea un tiempo de ejecución por defecto, que en el caso del problema de la imagen es 1.

lo que hace, es que al llegar un proceso lo ejecuta durante un milisegundo. Si al acabar no hay ningún proceso más, vuelve a ejecutar el A durante otro milisegundo. Si al acabar entra otro proceso, ejecutará éste segundo proceso durante 1 milisegundo. Al acabar mirará cuantos procesos nuevos han entrado y cuántos hay en espera. Y los irá ejecutando todos, por orden de llegada, pero durante ese milisegundo alternando entre todos los procesos.

imagen.png

Enlace a comentario
Compartir con otras webs

Abre el adjunto y pulsa el botón FIFO_FCFS.

A ver si soy capaz de encontrar el mecanismo por el que se determinan los valores de las celdas en gris (L?), de momento, no lo he conseguido. ¿Se supone que Lx representan los procesos en espera en un instante dado?

Procesos.xlsm

Enlace a comentario
Compartir con otras webs

Hace 2 horas, Antoni dijo:

Abre el adjunto y pulsa el botón FIFO_FCFS.

A ver si soy capaz de encontrar el mecanismo por el que se determinan los valores de las celdas en gris (L?), de momento, no lo he conseguido. ¿Se supone que Lx representan los procesos en espera en un instante dado?

Procesos.xlsm 398.85 kB · 0 descargas

Cuando un proceso "B" entra para su ejecución en el instante 2, por ejemplo, y en ese momento se está ejecutando otro proceso "A" que finalizará en el instante 6, los instantes de espera comprendidos entre el instante de llegada 2, y el instante 6 de finalización del proceso "A", serán los que esté en el estado Listo, y se representa como L1.

Si en el instante 4, entrase un proceso "C", pasaria al estado de Listo, pero en éste caso de representaría como L2, pues tiene delante al proceso "B" como L1 también en estado listo y en espera.

Un proceso "D" que entrase en el instante 5, pasaría al estado de Listo y se representaría como L3, pues tiene dos procesos en espera delante.

Al finalizar el proceso "A", estasmos en el instante 6, el proceso "B" entraría en ejecución, y pasaría al proceso "C" a L1, y al proceso "D" a L2.

El proceso "B" tiene un tiempo de ejecución de 4, entre los instantes 6 y 9. Al finalizar éste, estaríamos en el instante 10.

El proceso "C" entraría en ejecución, pasando al proceso "D" a L1. Estaría en éste estado hasta el instante 17 que finalizaría la ejecución del proceso "C".

En el instante 18 el proceso "D" entraría en ejecución, y en esos momentos no habría más procesos en espera.

En el instante 20 el proceso "D" finalizaría su ejecución, liberando el procesador en el instante 21

imagen.thumb.png.10388b35199a63c848f243fbb7611494.png

Enlace a comentario
Compartir con otras webs

Hola Antoni, buenos días

El código que me has enviado me arroja en error si cambio el instante de llegada, y en lugar de ponerlo en cero, lo pongo en tres

imagen.thumb.png.e55ee6cf289c9d0d432091ab9c089f72.png

imagen.thumb.png.a9477aeb6a0e801f6f2bfa6c0f6e186e.png

Por otra parte, me pasa lo mismo que en las veces anteriores que me has resuelto mis dudas y solucionado mis deseos, que no me entero de tu código.

Mira que no es muy extenso, pero aún así, no lo entiendo

Sub FIFO_FCFS()

'para que la pantalla no se actualice
Application.ScreenUpdating = False


fila = 17   'Fila inicio
columna = 2 'Columna inicio
'--
Cells(fila, columna).Resize(10, 30).ClearContents                'Limpiamos
Cells(fila, columna).Resize(10, 30).Interior.ColorIndex = xlNone 'Quitamos color relleno
'--

'si la celda E5 contiene algún valor
If Range("E5") <> "" Then

   'vete leyendo hacia abajo las filas desde la celda E4 ? (Pero no entiendo porque le das a x el valor 5, y luego referencias la celda E4
   For x = 5 To Range("E4").End(xlDown).Row

      'Aquí me pierdo totalmente, porque no entiendo lo del Resize(1, ni que significa el Range("M". Y que lo haga a partir de fila = 17 y columna = 2
      Cells(fila, columna).Resize(1, Range("M" & x)) = "E"                  'Valor E según tiempo

      'Aquí entiendo que a las mismas celdas del código de arriba donde escribes la "E", las pinte de rojo
      Cells(fila, columna).Resize(1, Range("M" & x)).Interior.Color = vbRed 'Color rojo

      'Aquí me vuelve a pasar lo mismo, me pierdo en el Range("I"
      If Range("I" & x) > 0 Then

         'A partir de fila=17 y columna=2 y me vuelvo a perder en el Resize, que lo pinte de color gris
         Cells(fila, Range("I" & x) + 2).Resize(1, columna - Range("I" & x) - 2).Interior.ColorIndex = 15 'Gris
      End If

      'a la fila le sumanos 1
      fila = fila + 1

      'a la columna le sume el valor que se me escapa de Range("M" & x)
      columna = columna + Range("M" & x)
   Next
End If
End Sub

 

Un saludo y muchas gracias, como siempre, por tu tiempo de dedicación y tu ayuda

Enlace a comentario
Compartir con otras webs

He añadido cálculos intermedios con fórmulas para facilitarte la comprensión del código.

Básicamente, tu problema reside en la comprensión de la propiedad Resize del objeto Range.

La propiedad Resize sirve para redimensionar rangos a partir de otro, generalmente a partir de una celda.

Ejemplo:

Range("A1") o Cells(1,1) hace referencia a la celda A1, pues bien, si ponemos Cells(1,1).Resize(1,3) o Range("A1").Resize(1,3),estamos diciendo que nuestro rango abarca 1 fila y 3 columnas a partir de la celda A1, o sea A1:C1, otro ejemplo, Cells(6,5).Resize(2,4) o Range("E6").Resize(2,4), haría referencia al rango E6:H7, resumiendo, la propiedad Resize permite alargar rangos en filas y columnas Range.Resize(filas,columnas).

Procesos.xlsm

Enlace a comentario
Compartir con otras webs

Muchísimas gracias Antoni, la verdad que algo más claro el código me queda. Aunque por ahora, me sigue resultando imposible desarrollar los siguientes algoritmos, aún se me escapan trozos de código que no me quedan claros del todo.

Me pasa como con los estudios, estamos dando Java y C#, y en ésta primera evaluación ando perdido del todo, de echo, las asignaturas de programación, las he suspendido.

Por cierto, si cambio en el proceso A, el tiempo de llegada de 0 por 1, me escribe espacios en blanco en los estados de espera.

Me sorprende la capacidad de resolución que demuestras, quien pudiera.

Muchísimas gracias por todo, espero algún día poder enterarme de algo. Un saludo

Enlace a comentario
Compartir con otras webs

Hola

Lo que estas tratando de simular no es cosa menor, VBA no tiene soporte nativo para múltiples hilos, para ellos debes de recurrir a la API de Windows, coloco un enlace donde puedes ver como se maneja dicha API

https://www.freevbcode.com/ShowCode.asp?ID=4029

Si usas C sharp ahí si lo tienes nativo y por tanto encontrarás bastantes ejemplos en la web

saludos

 

 

 

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 97 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola que tal amigos programadores por favor me podrían ayudar con una macro que me genere un archivo CSV delimitado por comas, la estructura del archivo CSV no deberá llevar encabezado, los datos del archivo CSV serán obtenidos de la hoja “Datos”. En la columna A: deberá tener la clave clues que se toma de la columna B de la hoja Datos En la Columna B: el Código (son 230 codigos que van del rango G1:IB1 de la hoja datos) En la Columna C: el valor almacenado a su correspondiente al código y clues En la Columna D: el número del mes que se obtendrá de la de la columna E de la hoja Datos En la Columna E: el año que se tomará de la columna F de la hoja de Datos   Son 230 códigos por lo que la macro generará 230 filas por cada clave clues que tenga la hoja Datos En el archivo anexo una hoja llamada CSV para que vean la estructura que tendrá, el archivo CSV estará delimitado por comas   Les agradecería mucho que me ayuden por favor, Dios los bendiga Exportar datos a csv.xlsx
    • Hola buenas tardes.   Debido al trabajo debo estar comparando en un periodo unos archivos dentro de una carpeta o subcarpeta. en base a la fecha de creacion o modificacion.  pero tengo que estar viendo carpeta por carpeta y aveces son varios. Con una macro intente  listar los archivos de cualquier carpeta y subcarpeta, esto activandolo segun la celdaactiva. El problema es que tiene algunos errores. 1. si la carpeta cuenta con subcarpetas me los manda a muchas filas abajo. Mi idea es hoja(Así debe quedar) Que con una macro pueda seleccionar la carpeta desde el buscador y me de la lista de archivos a partir de la fila 6. siendo columna A= fecha de modificación, columna B =Fecha de creación y columna C=Nombre del archivo con hiperlink. Con otro o con la misma macro poder seleccionar otra carpeta y sus subcarpetas, según sea el caso. y me liste a partir de la columna F de la fila 6 Siendo La columna F=Nombre del archivo, columna H=fecha de creación, columna I=ultima modificación   Para así poder acceder y comparar mis archivos, directamente desde excel.   Muchas gracias Mariano       Listar archivos de 2 carpetas para comparar.xlsm
    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
    • Agradecido Antoni! Tus sugerencias me ayudaron mucho! Como pudiese hacerte llegar el archivo?
    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.