¿Alguien sabe de una manera de dormir por un determinado número de milisegundos en Fortran? No quiero utilizar llamadas de sistema no portátiles, por lo que se preferiría cualquier elemento intrínseco de las bibliotecas Fortran o C.Dormir en Fortran
Respuesta
Utilizando el Fortran ISO C Encuadernación utilizar el sueño de la biblioteca C para dormir en unidades de segundos:
module Fortran_Sleep
use, intrinsic :: iso_c_binding, only: c_int
implicit none
interface
! should be unsigned int ... not available in Fortran
! OK until highest bit gets set.
function FortSleep (seconds) bind (C, name="sleep")
import
integer (c_int) :: FortSleep
integer (c_int), intent (in), VALUE :: seconds
end function FortSleep
end interface
end module Fortran_Sleep
program test_Fortran_Sleep
use, intrinsic :: iso_c_binding, only: c_int
use Fortran_Sleep
implicit none
integer (c_int) :: wait_sec, how_long
write (*, '("Input sleep time: ")', advance='no')
read (*, *) wait_sec
how_long = FortSleep (wait_sec)
write (*, *) how_long
stop
end program test_Fortran_Sleep
¿Crees que la función 'dormir' provista dentro de Intel Fortran básicamente está haciendo lo mismo que proporcionó anteriormente? –
Sí, la funcionalidad es probablemente la misma. Una subrutina similar está disponible en gfortran. Esta es una extensión que podría no ser parte de algún otro compilador. –
Hola, en Linux podría usar esto y funciona bien. En Windows y al utilizar MinGW, al compilarse se queja de que no puede encontrar la función Sleep. ¿Sabes cómo arreglar ésto? –
Usted puede usar Fortran funciones intrínsecas estándar de hacer esto sin C vinculante:
program sleep
!===============================================================================
implicit none
character(len=100) :: arg ! input argument character string
integer,dimension(8) :: t ! arguments for date_and_time
integer :: s1,s2,ms1,ms2 ! start and end times [ms]
real :: dt ! desired sleep interval [ms]
!===============================================================================
! Get start time:
call date_and_time(values=t)
ms1=(t(5)*3600+t(6)*60+t(7))*1000+t(8)
! Get the command argument, e.g. sleep time in milliseconds:
call get_command_argument(number=1,value=arg)
read(unit=arg,fmt=*)dt
do ! check time:
call date_and_time(values=t)
ms2=(t(5)*3600+t(6)*60+t(7))*1000+t(8)
if(ms2-ms1>=dt)exit
enddo
!===============================================================================
endprogram sleep
Suponiendo que el ejecutable es slp:
~$ time slp 1234
real 0m1.237s
user 0m1.233s
sys 0m0.003s
Añadir un caso especial de este programa si y O te preocupa que se rompa alrededor de la medianoche :)
Lo que me recuerda. Este enfoque definitivamente no debe usarse si necesita tiempo de CPU durante el período de sueño. Supuse que no es así por mucho tiempo espera por datos remotos. Si lo hace, es mucho mejor usar un contenedor de shell, porque el ejemplo anterior es intensivo en CPU. – milancurcic
- 1. Dormir en JQuery?
- 2. Función privada en Fortran
- 3. ¿Qué significa "%" en Fortran?
- 4. ¿Cómo emulo "dormir" en NodeJS?
- 5. Cómo evitar dormir en Android
- 6. Intentando dormir bien en Linux
- 7. Dormir tarea (System.Threading.Tasks)
- 8. software de conversión para fortran 77 a fortran 90
- 9. Dormir en un hilo de C# agrupado
- 10. Dormir en un hilo (Hilos C/POSIX)
- 11. Alternativa al hilo. ¿Dormir en C#?
- 12. Usando NSThread dormir en una NSOperation
- 13. ¿Hay alguna alternativa para dormir() en C?
- 14. fortran GUARDAR declaración
- 15. Fortran asignar/desasignar
- 16. Fortran forall restrictions
- 17. Best Fortran IDE
- 18. Comportamiento 'Dormir' extraño entre sistemas
- 19. Fortran 90 parámetro tipo
- 20. Fortran 90 Recursos?
- 21. Dormir por una duración exacta
- 22. ¿Es posible imprimir en Fortran en python?
- 23. Cómo imprimir matrices Fortran en GDB?
- 24. salida estándar en el código Fortran MPI
- 25. Subrutinas puras en Fortran - Optimización del compilador
- 26. Función Devolver una matriz en Fortran
- 27. Array of Strings en Fortran 77
- 28. convirtiendo el código de MATLAB en Fortran
- 29. ¿Qué significa 10.D00 en Fortran?
- 30. Variables no inicializadas en Fortran 2003
Hay una subrutina 'reposo' que toma varios segundos como argumento pero no estoy seguro de dónde viene eso (¿envoltura para la función C?). Parece funcionar bien para lo que intento. Estoy usando el Intel Fortran Compiler 12 en una PC. –
Acabo de encontrar un programa Fortran que usa un sistema de llamadas (no estándar) (char_arg) que accede al sistema sin gastos generales de la CPU. Lo probé con pgf90, ifort y gfortran, todo está bien con él. Por lo tanto, uno podría hacer algo como llamar al sistema ('sleep' // number_of_seconds_string) para obtener una función de suspensión. No tuve la oportunidad de probar esto con otros compiladores. – milancurcic