Oggi vi propongo di creare una simulazione di scheduling FCFS, io l'ho fatta in VBA, quindi vi posto la macro, non me ne vogliate, odio il VB ho dovuto per la scuola, non mi interessa com'è venuto il mio, voi fate il vostro
link: Wikipedia
Se volete testare il mio:
[ot]in A2 scrivete "Nome"
in B2 scrivete "Tempo di arrivo"
in C2 scrivete "Durata"
in A3:A7 scrivete i nomi dei processi
in B3:B7 scrivete il tempo di arrivo dei processi
in C3:C7 scrivete la durata dei singoli processi
in E2 scrivete "Tempo"
in F2 scrivete "Processo"
in H2 scrivete "Coda"
infine create un bottone, inseritelo dove volete e assegnategli la macro do_tail
siete pronti per cliccare sul bottone e "ammirare" questo "capolavoro"[/ot]
Mi fa strano vedere pastato un codice in VBA...saràche sono abituato a pensare a windows come il closed source che è XD
link: Wikipedia
Se volete testare il mio:
[ot]in A2 scrivete "Nome"
in B2 scrivete "Tempo di arrivo"
in C2 scrivete "Durata"
in A3:A7 scrivete i nomi dei processi
in B3:B7 scrivete il tempo di arrivo dei processi
in C3:C7 scrivete la durata dei singoli processi
in E2 scrivete "Tempo"
in F2 scrivete "Processo"
in H2 scrivete "Coda"
infine create un bottone, inseritelo dove volete e assegnategli la macro do_tail
siete pronti per cliccare sul bottone e "ammirare" questo "capolavoro"[/ot]
Codice:
'Simulazione di un algoritmo di scheduling FCFS
'First Come First Served
'Non l'ho fatto per piacere, bensì per studio,
'Don't try this at home, please
'Programmare in VBA o VB in generale provoca
'Gravi malattie mentali, quali depressione
Option Explicit
'Definizione di una struttura per i processi
Type proc
nome As String
tempo As Integer
durata As Integer
End Type
Public Sub do_tail()
'Tutti i processi presi in input dal foglio di calcolo
Dim processi(1 To 5) As proc
Dim temp As proc
'Proocesso attualmente in esecuzione
Dim esecuzione As proc
'Coda di esecuzione
Dim coda(1 To 5) As proc
'Tempo dell'operazione
Dim tempo As Integer
'Tempo totale
Dim tottempo As Integer
'Numero dei processi presi in input
Dim nProc As Integer
'Nome dei processi in esecuzione
Dim nEsec As Integer
'Variabili contatori
Dim i As Integer
Dim j As Integer
Dim asdasd As Double
'Variabile booleana che indica se ci sono o meno processi in
'esecuzione
Dim inExec As Boolean
'Tempo di esecuzione del processo
Dim proTime As Integer
inExec = False
'Stampo la linea del tempo e ricavo il tempo totale
tottempo = printempo + 1
nProc = 5
nEsec = 0
'Ricavo i processi dal foglio
For i = 1 To 5
processi(i).nome = Cells(2 + i, 1).Value
processi(i).tempo = Cells(2 + i, 2).Value
processi(i).durata = Cells(2 + i, 3).Value
Next i
'Ordino i processi in ordine decrescente
For i = 1 To 5
For j = i + 1 To 5
If processi(i).tempo < processi(j).tempo Then
temp = processi(i)
processi(i) = processi(j)
processi(j) = temp
End If
Next j
Next i
'Il seguente codice commentato stampa sul foglio di calcolo i
'processi ordinati
'For i = 1 To 5
' Cells(9 + i, 1).Value = processi(i).nome
' Cells(9 + i, 2).Value = processi(i).tempo
' Cells(9 + i, 3).Value = processi(i).durata
'Next i
i = 0
'Inizia lo scheduling, cicla fino a quando il tempo non eguaglia
'il tempo totale
Do Until tempo = tottempo
'MsgBox (inExec & " " & nEsec)
'Se la durata del processo è minore della durata attuale
If esecuzione.durata = proTime Then
inExec = False
proTime = 0
'Se ci sono processi in coda
If nEsec > 0 Then
'Eseguo il primo processo in coda
esecuzione = coda(1)
'Swappo la coda
If Not nEsec = 1 Then
For asdasd = 2 To nEsec
coda(asdasd - 1) = coda(asdasd)
Next asdasd
End If
nEsec = nEsec - 1
inExec = True
End If
End If
'Se ci sono processi in stato di attesa
If nProc > 0 Then
'Se il tempo del prossimo processo corrisponde al tempo corrente
If processi(nProc).tempo = tempo Then
'Se ci sono processi in esecuzione
'Metto in coda il processo
If inExec Then
nEsec = nEsec + 1
coda(nEsec) = processi(nProc)
nProc = nProc - 1
'Altrimenti eseguo il processo in attesa
Else
esecuzione = processi(nProc)
inExec = True
nProc = nProc - 1
End If
End If
End If
'Stampa il processo
Cells(3 + tempo, 6).Value = esecuzione.nome
'Incrementa il tempo del processo in esecuzione
proTime = proTime + 1
'Pulisce lo spazio della coda
Range("H3:H7").ClearContents
'Stampa la coda se c'è qualche processo in pronto
If Not nEsec = 0 Then
For asdasd = 1 To nEsec
Cells(asdasd + 2, 8).Value = coda(asdasd).nome
Next asdasd
End If
'Incrementa il tempo
tempo = tempo + 1
'Delay
For asdasd = 0 To 40000000
Next asdasd
Loop
End Sub
'Funzione che stampa il tempo e torna il valore del
'Tempo totale
Public Function printempo()
'Tempo di arrivo minore
Dim min As Integer
'Variabile contatore
Dim i As Integer
'Tempo totale di esecuzione
Dim tempoTot As Integer
'Definisco come minimo il primo valore
min = Range("B3").Value
'Ciclo tutti i valori di tempo d'arrivo per
'calcolare il minimo
For i = 3 To 7
If min > Cells(i, 2).Value Then
min = Cells(i, 2)
End If
Next i
'Definisco il tempo totale come il tempo di arrivo minimo
tempoTot = min
'Sommo al tempo totale tutti i tempi d'esecuzione
For i = 3 To 7
tempoTot = tempoTot + Cells(i, 3).Value
Next i
tempoTot = tempoTot - 1
'Stampo la linea del tempo
For i = 0 To tempoTot
Cells(i + 3, 5).Value = i
Cells(i + 3, 6).ClearContents
Next i
'Ritorno il tempo totale
printempo = tempoTot
End Function