Topic: Appgraphics mutex

Can you give me a little more explanation how mutexes works with Appgraphics?
I wish keep main program computing and comunicate by shared variables with interface. To protect them I create mutex by call of createmutex() . Inside the main program I'm able to lock it and unlock it. But if I try to do same inside callback procedure konec I never get lock. For now I just comment out few lines of code but it is unsatisfactory.
Could you help me, please?


module apptools
    use appgraphics
    integer :: myscreen
    integer :: menuroot_id !> root menu id
    integer :: menu_close
    integer :: menu_actions
    integer :: menu_help
    integer :: mclose_act
    integer :: mut_main
    logical :: skoncit

  subroutine konec()
    print *, "koncime", mut_main
    !if ( lockmutex(mut_main, -1) ) then
       skoncit = .true.
       print *, "oznaceno"
       !call unlockmutex(mut_main)
    !end if
  end subroutine konec
end module apptools

program main
use appgraphics
use apptools
implicit none

    real(16) :: s,i
    integer :: inisizex, inisizey
    character(65) :: repstr
    integer :: cnt
    inisizex = 800
    inisizey = 600
    skoncit = .false.
    mut_main = createmutex()
    print *, mut_main
    print *, lockmutex(mut_main)
    call unlockmutex(mut_main)
    myscreen = initwindow(inisizex, inisizey, closeflag=.false.)
    menuroot_id = addmenu("")
    print *, menuroot_id
    menu_actions = addmenu("Activity",menuroot_id)
    print *, menu_actions
    menu_close   = addmenu("Konec", menuroot_id)
    print *, menu_close
    menu_help = addmenu("Napoveda", menuroot_id)
    print *, menu_help
    mclose_act = addmenuitem("Ukoncit program,",menu_close,konec)
    !call loop()
    s = 0
    i = 0
    cnt = 0
   mainloop : do
      i = i + 1
      s = s + 1/i
      cnt = cnt + 1
      !print *, i,s
      if ( isvalidwindow(myscreen) .and. (cnt == 10000) ) then
        cnt = 0
        write(repstr,"(f15.0,2f25.17)") i,s,s-log(i)
        call outtextxy(50,200,repstr);
        if ( lockmutex(mut_main) ) then
          if ( skoncit ) then
            print *, "jdu koncit"
            call unlockmutex(mut_main)
            exit mainloop
          end if
        end if
      end if
    end do mainloop
    print *, "Chci zavrit okno5"
    call closewindow(myscreen)

end program main

Re: Appgraphics mutex


I haven't tried your program yet, but I do notice that, in your main loop, you lock the mutex, but you only unlock it if skoncit is .true..  I think you want to:

        if ( lockmutex(mut_main) ) then
          if ( skoncit ) then
            print *, "jdu koncit"
            call unlockmutex(mut_main)
            exit mainloop
          end if
          call unlockmutex(mut_main)
        end if

Does that fix the issue?

Jeff Armstrong
Approximatrix, LLC

Re: Appgraphics mutex

thank you. You are right, my mistake.