我有一个Python GUI(wxPython),包含了一个fortran"后端,"使用f2py。有时,fortran进程可能会运行很长时间,我们希望在GUI中放置一个进度条来通过Fortran例程更新进度。有没有办法获取Fortran例程的状态/进度,而不涉及文件I / O?
答案 0 :(得分:0)
如果您基本了解代码的哪些部分占用的时间最多,则可以包含进度指示器。请考虑以下示例代码:
program main
implicit none
integer, parameter :: N = 100000
integer :: i
real, allocatable :: a(:), b(:)
! -- Initialization
write(*,*) 'FORFTP: Beginning routine'
allocate(a(N), b(N))
a = 0.
b = 0.
write(*,*) 'FORFTP: Completed initialization'
do i=1,N
call RANDOM_NUMBER(a(i))
b(i) = exp(a(i)) ! Some expensive calculation
if (mod(i,N/100)==0) then ! -- Assumes N is evenly divisible by 100
write(*,*) 'FORFTP: completed ', i*100/N, ' percent of the calculation'
endif
enddo
write(*,*) 'FORFTP: completed routine'
end program main
然后,用户将在初始化之后以及“昂贵计算”的每个百分比完成后获得更新。
我不知道f2py
是如何工作的,但我认为python有一些方法可以读取fortran在运行时输出的内容,并在其中显示gui。在此示例中,标记为FORFTP
的任何内容都将在gui中输出,而我正在使用标准输出。
此示例说明了调查进度的问题。与计算相比,很难理解分配所花费的时间。因此,很难说初始化是总执行时间的15%,例如。
然而,即使他们没有精确的进度表,对正在进行的操作进行更新仍然很有用。
修改强> 例程提供以下输出:
> pgfortran main.f90
> ./a.out
FORFTP: Beginning routine
FORFTP: Completed initialization
FORFTP: completed 1 percent of the calculation
FORFTP: completed 2 percent of the calculation
...
FORFTP: completed 99 percent of the calculation
FORFTP: completed 100 percent of the calculation
FORFTP: completed routine
答案 1 :(得分:0)
如果您大致知道每项任务将花费多长时间,那么最大的选择就是根据任务开始以来经过多长时间的进度,根据预期的任务持续时间来衡量。
为了保持相关性,您每次都可以存储任务的运行持续时间,并使用它或平均值作为基准时间线。
有时,我们可以过度复杂化;)