Page 1 of 1

Invalid Memory Access

Posted: Thu Mar 14, 2024 3:37 pm
by matalog
Line 183 of this program causes a problem when I run it, then press key "E" to initialise, then click SAVE before it is finished running. I assumed I would be able to save an image out while it is being produced. Am I trying to do something silly? It works fine and saves if I do not try to use

Code: Select all

Val(GetGadgetText(opvstring))
.

Code: Select all


UseJPEGImageEncoder()


#width = 1350
#height = 1000
#strgdwid=15

Enumeration
  #Menu_Escape
  #Menu_Space
  #Menu_W
  #Menu_C
  #Menu_E
  #Menu_P
  #Menu_O
  #Menu_A
  
EndEnumeration


Global s=1,a.d=0
Global drawleave=0

OpenWindow(0,0,0,1350,1000,"blabla",#PB_Window_MinimizeGadget)
CreateImage(0,1350,900)
AddWindowTimer(0,0,50)
imgad=ImageGadget(#PB_Any, 0, 0, 1350, 900, ImageID(0))
AddKeyboardShortcut(0, #PB_Shortcut_Escape, #Menu_Escape)
AddKeyboardShortcut(0, #PB_Shortcut_Space, #Menu_Space)
AddKeyboardShortcut(0, #PB_Shortcut_W, #Menu_W)
AddKeyboardShortcut(0, #PB_Shortcut_C, #Menu_C)
AddKeyboardShortcut(0, #PB_Shortcut_E, #Menu_E)
AddKeyboardShortcut(0, #PB_Shortcut_P, #Menu_P)
AddKeyboardShortcut(0, #PB_Shortcut_O, #Menu_O)
AddKeyboardShortcut(0, #PB_Shortcut_A, #Menu_A)
sstring=StringGadget(#PB_Any,560*s,910*s,60,20,"1",#PB_String_LowerCase )
sgad=TextGadget  (#PB_Any, 540, 913*s, #strgdwid, 24, "S")
a1string=StringGadget(#PB_Any,30*s,910*s,50,20,"200",#PB_String_LowerCase )
a1gad=TextGadget  (#PB_Any, 10, 913*s, #strgdwid, 24, "A1")
a2string=StringGadget(#PB_Any,110*s,910*s,50,20,"200",#PB_String_LowerCase )
a2gad=TextGadget  (#PB_Any, 90, 913*s, #strgdwid, 24, "A2")
a3string=StringGadget(#PB_Any,190*s,910*s,50,20,"200",#PB_String_LowerCase )
a3gad=TextGadget  (#PB_Any, 170, 913*s, #strgdwid, 24, "A3")
a4string=StringGadget(#PB_Any,270*s,910*s,50,20,"200",#PB_String_LowerCase )
a4gad=TextGadget  (#PB_Any, 250, 913*s, #strgdwid, 24, "A4")
f1string=StringGadget(#PB_Any,30*s,940*s,50,20,"411",#PB_String_LowerCase )
f1gad=TextGadget  (#PB_Any, 10, 943*s, #strgdwid, 24, "F1")
f2string=StringGadget(#PB_Any,110*s,940*s,50,20,"411",#PB_String_LowerCase )
f2gad=TextGadget  (#PB_Any, 90, 943*s, #strgdwid, 24, "F2")
f3string=StringGadget(#PB_Any,190*s,940*s,50,20,"444",#PB_String_LowerCase )
f3gad=TextGadget  (#PB_Any, 170, 943*s, #strgdwid, 24, "F3")
f4string=StringGadget(#PB_Any,270*s,940*s,50,20,"444",#PB_String_LowerCase )
f4gad=TextGadget  (#PB_Any, 250, 943*s, #strgdwid, 24, "F4")
spinxstring=StringGadget(#PB_Any,350*s,910*s,50,20,"200",#PB_String_LowerCase )
spinxgad=TextGadget  (#PB_Any, 330, 913*s, #strgdwid, 24, "SX")
spinystring=StringGadget(#PB_Any,350*s,940*s,50,20,"200",#PB_String_LowerCase )
spinygad=TextGadget  (#PB_Any, 330, 943*s, #strgdwid, 24, "SY")

gstring=StringGadget(#PB_Any,440*s,910*s,60,20,"0.000005",#PB_String_LowerCase )
gsgad=TextGadget  (#PB_Any, 420, 913*s, #strgdwid, 24, "T")
p1string=StringGadget(#PB_Any,520*s,940*s,50,20,"0",#PB_String_LowerCase )
p1gad=TextGadget  (#PB_Any, 500, 943*s, #strgdwid, 24, "P1")
p2string=StringGadget(#PB_Any,600*s,940*s,50,20,"0",#PB_String_LowerCase )
p2gad=TextGadget  (#PB_Any, 580, 943*s, #strgdwid, 24, "P2")
opvstring=StringGadget(#PB_Any,620*s,970*s,50,20,"0",#PB_String_LowerCase )
checkgad=CheckBoxGadget(#PB_Any,680*s,970*s,50, 20, "")
SetGadgetState(checkgad,#PB_Checkbox_Checked)

opvgad=TextGadget  (#PB_Any, 590, 973*s, #strgdwid+8, 24, "OPV")
p3string=StringGadget(#PB_Any,680*s,940*s,50,20,"0",#PB_String_LowerCase )
p3gad=TextGadget  (#PB_Any, 660, 943*s, #strgdwid, 24, "P3")
p4string=StringGadget(#PB_Any,760*s,940*s,50,20,"0",#PB_String_LowerCase )
p4gad=TextGadget  (#PB_Any, 740, 943*s, #strgdwid, 24, "P4")
opacity=StringGadget(#PB_Any,760*s,970*s,50,20,"80",#PB_String_LowerCase )
opgad=TextGadget  (#PB_Any, 740, 973*s, #strgdwid, 24, "OP")
d1string=StringGadget(#PB_Any,30*s,970*s,50,20,"0",#PB_String_LowerCase )
d1gad=TextGadget  (#PB_Any, 10, 973*s, #strgdwid, 24, "d1")
d2string=StringGadget(#PB_Any,110*s,970*s,50,20,"0",#PB_String_LowerCase )
d2gad=TextGadget  (#PB_Any, 90, 973*s, #strgdwid, 24, "d2")
d3string=StringGadget(#PB_Any,190*s,970*s,50,20,"0",#PB_String_LowerCase )
d3gad=TextGadget  (#PB_Any, 170, 973*s, #strgdwid, 24, "d3")
d4string=StringGadget(#PB_Any,270*s,970*s,50,20,"0",#PB_String_LowerCase )
d4gad=TextGadget  (#PB_Any, 250, 973*s, #strgdwid, 24, "d4")
astring=StringGadget(#PB_Any,350*s,970*s,50,20,"0",#PB_String_LowerCase )
astrgad=TextGadget  (#PB_Any, 330, 973*s, #strgdwid, 24, "A")
aonstring=StringGadget(#PB_Any,440*s,970*s,50,20,"1",#PB_String_LowerCase )
aongad=TextGadget  (#PB_Any, 410, 973*s, #strgdwid, 24, "Aon")
bstring=StringGadget(#PB_Any,520*s,970*s,50,20,"0",#PB_String_LowerCase )
bstrgad=TextGadget  (#PB_Any, 500, 973*s, #strgdwid, 24, "B")
save_button=ButtonGadget(#PB_Any,850*S,910*s,60,30,"SAVE")
stop_button=ButtonGadget(#PB_Any,850*S,970*s,60,30,"CANCEL")
opvrgad=TextGadget  (#PB_Any, 920*s, 970*s, #strgdwid, 24, "-")
idstgad=StringGadget(#PB_Any,1000*s,970,80,25,"IDLE",#PB_Text_Center)
valgad=StringGadget(#PB_Any,1000*s,940,80,25,"0",#PB_Text_Center)
f1.d=ValD(GetGadgetText(F1string)):f2.d=ValD(GetGadgetText(F2string)):f3.d=ValD(GetGadgetText(F3string)):f4.d=ValD(GetGadgetText(F4string))

Procedure Save(null)
  Shared image, a1string,a2string,a3string,a4string,f1string,f2string,f3string,f4string,spinxstring,spinystring,gstring,P1STRING,P2STRING,P3STRING,P4STRING,sstring,d1string,d2string,d3string,d4string,aonstring,bstring,s,opacity,imgad,opvstring,opvrgad,idstgad,checkgad
   a1.d=ValD(GetGadgetText(a1string)):a2.d=ValD(GetGadgetText(a2string));a2.d=200*s:
   a3.d=ValD(GetGadgetText(a3string)):a4.d=ValD(GetGadgetText(a4string))
   d1.d=ValD(GetGadgetText(d1string)):d2.d=ValD(GetGadgetText(d2string)):d3.d=ValD(GetGadgetText(d3string)):d4.d=ValD(GetGadgetText(d4string))
   f1.d=ValD(GetGadgetText(F1string)):f2.d=ValD(GetGadgetText(F2string)):f3.d=ValD(GetGadgetText(F3string)):f4.d=ValD(GetGadgetText(F4string))
   p1.d=ValD(GetGadgetText(P1string)):p2.d=ValD(GetGadgetText(P2string)):p3.d=ValD(GetGadgetText(P3string)):p4.d=ValD(GetGadgetText(P4string))
spinx.d=ValD(GetGadgetText(spinxstring)) :spiny.d=ValD(GetGadgetText(spinystring))
  fname$="blabla2024"+"-"+FormatDate("%yyyy%mm%dd_%hh%ii%ss", Date())+"-"+"a1="+StrD(a1)+"a2="+StrD(a2)+"a3="+StrD(a3)+"a4="+StrD(a4)+"d1="+StrD(d1)+"d2="+StrD(d2)+"d3="+StrD(d3)+"d4="+StrD(d4)+"p1="+StrD(p1)+"p2="+StrD(p2)+"p3="+StrD(p3)+"p4="+StrD(p4)+"f1="+StrD(f1)+"f2="+StrD(f2)+"f3="+StrD(f3)+"f4="+StrD(f4)+".jpg"
  
  If SaveImage(4,fname$, #PB_ImagePlugin_JPEG,10)
   ; Debug "save success"
    ;RunProgram("explorer.exe",fname$,"")
    ;SetClipboardText(fname$)
    
  EndIf
  
EndProcedure

Procedure.l HSV(Hue.d, Saturation.d, Value.d)
	Protected H.i = Int(Hue/60)
	Protected f.d = 1-Pow(Cos((Hue/60-H)*#PI/2), 2)
	Protected Sat.d = Saturation/100
	If Sat > 1.0 : Sat = 1.0 : ElseIf Sat < 0.0 : Sat = 0.0 : EndIf
	Protected V.d = Value * 2.55
	If V > 255 : V = 255 : ElseIf V < 0 : V = 0 : EndIf
	Protected p.i = V * (1-Sat)
	Protected q.i = V * (1-Sat*f)
	Protected t.i = V * (1-Sat*(1-f))
	Select H
		Case 1 : ProcedureReturn RGB(q,V,p)
		Case 2 : ProcedureReturn RGB(p,V,t)
		Case 3 : ProcedureReturn RGB(p,q,V)  
		Case 4 : ProcedureReturn RGB(t,p,V)
		Case 5 : ProcedureReturn RGB(V,p,q)  
		Default : ProcedureReturn RGB(V,t,p)
	EndSelect
EndProcedure


Procedure Draw(null)
 drawleave=0

  
  Shared image, a1string,a2string,a3string,a4string,f1string,f2string,f3string,f4string,spinxstring,spinystring,gstring,P1STRING,P2STRING,P3STRING,P4STRING,sstring,d1string,d2string,d3string,d4string,aonstring,bstring,s,opacity,imgad,opvstring,opvrgad,idstgad,checkgad



  Static color=255
  s=ValD(GetGadgetText(sstring))
  Debug s
      CreateImage(4, 1350*s, 900*s) 

      If StartDrawing(ImageOutput(4))
        DrawingMode(#PB_2DDrawing_AlphaBlend)
    g1.d=ValD(GetGadgetText(gstring))

    rot.d=2*#PI/4
    Box(0,0,1350*s,900*s,0)
    h.d=2:u.d=1:d.d=0
    a1.d=ValD(GetGadgetText(a1string))*s:a2.d=ValD(GetGadgetText(a2string))*s;a2.d=200*s:
    a3.d=ValD(GetGadgetText(a3string))*s:a4.d=ValD(GetGadgetText(a4string))*s
    d1.d=ValD(GetGadgetText(d1string)):d2.d=ValD(GetGadgetText(d2string)):d3.d=ValD(GetGadgetText(d3string)):d4.d=ValD(GetGadgetText(d4string))
    f1.d=ValD(GetGadgetText(F1string)):f2.d=ValD(GetGadgetText(F2string)):f3.d=ValD(GetGadgetText(F3string)):f4.d=ValD(GetGadgetText(F4string))
    p1.d=ValD(GetGadgetText(P1string)):p2.d=ValD(GetGadgetText(P2string)):p3.d=ValD(GetGadgetText(P3string)):p4.d=ValD(GetGadgetText(P4string))
    spinx.d=ValD(GetGadgetText(spinxstring)) :spiny.d=ValD(GetGadgetText(spinystring))
    op.d=ValD(GetGadgetText(opacity))
    Debug ValD(GetGadgetText(opvstring))
    If Val(GetGadgetText(opvstring))>0
      opv.d=op*(1-(a/(8*#PI)))

    Else
      opv=op
      EndIf

    t.d=0

    a.d=0
    aon.d=ValD(GetGadgetText(aonstring))
    b.d=ValD(GetGadgetText(bstring))
    
          If GetGadgetState(checkgad)=#PB_Checkbox_Checked  
    Repeat

      If Val(GetGadgetText(opvstring))>0                       ;   THIS LINE CAUSES A PROBLEM - Invalid Memory access.
        
      opv.d=op*(1-(a/(8*#PI)))
    Else
      opv=op
    EndIf


      a=a+g1

      If drawleave=1
        a=8*#PI+1
        EndIf
      Until a>8*#PI
    Else 
          Repeat


    
      a=a+g1
      If drawleave=1
        a=8*#PI+1
        EndIf
      Until a>8*#PI
      
        EndIf

    StopDrawing()
    
  EndIf
  

  
  
      CopyImage(4, copy)
          ResizeImage(copy, 1350, 900)
          If StartDrawing(ImageOutput(0))
            DrawImage(ImageID(copy), 0, 0)
            StopDrawing()
            SetGadgetState(imgad, ImageID(0))
          EndIf          
    
  
           SetGadgetText(idstgad,"IDLE")

  
EndProcedure


Repeat 
  

  

  event=WaitWindowEvent()
  
        If Event = #PB_Event_Timer
          SetGadgetText(valgad,StrD(a/(8*#PI)*100))

      EndIf    

  gadget=EventGadget()

  
  Select event
          Case #PB_Event_Menu
      Select EventMenu()
        Case #Menu_C

        Case #menu_E

          If IsThread(th)=0
         SetGadgetText(idstgad,"BUSY")
         th=CreateThread(@Draw(),0)
         EndIf

        Case #Menu_O

        Case #Menu_P

        Case #Menu_Escape
          quit = #True
        Case #Menu_Space
          Delay(800)
        Case #Menu_W
          SaveImage(4,"blabla2024 - "+FormatDate("%yyyy%mm%dd_%hh%ii%ss", Date())+Str(Random(9999,1))+".jpg", #PB_ImagePlugin_JPEG,99)
          save=save+1
      EndSelect



EndSelect



  If event=#PB_Event_Gadget
    Select gadget
      Case save_button
        CreateThread(@Save(),0)
        
              Case stop_button
        drawleave=1
    EndSelect
  EndIf
  
Until quit=#True

End  

Any ideas how to stop the error?

Re: Invalid Memory Access

Posted: Thu Mar 14, 2024 4:30 pm
by Axolotl
Please don't be angry and misunderstand.
I would not write a program like this, but instead first read all the data from the gadgets into variables (structure or array) and then start the thread. I would also not read a value from the gadget each time within a loop.
With a different program structure, this error would not occur.

In principle there is nothing wrong with the line, but within a loop within a thread .....
And you accessed the gadgets from different threads, which is not good at all.

Re: Invalid Memory Access

Posted: Thu Mar 14, 2024 4:55 pm
by matalog
Axolotl wrote: Thu Mar 14, 2024 4:30 pm Please don't be angry and misunderstand.
I would not write a program like this, but instead first read all the data from the gadgets into variables (structure or array) and then start the thread. I would also not read a value from the gadget each time within a loop.
With a different program structure, this error would not occur.

In principle there is nothing wrong with the line, but within a loop within a thread .....
And you accessed the gadgets from different threads, which is not good at all.
You are right, I'm wasting time reading gadgets, and they will not change between the thread starting and stopping. Thanks.

Re: Invalid Memory Access

Posted: Thu Mar 14, 2024 5:28 pm
by Axolotl
just a small tip on so many gadgets.... something like this could be helpful.

Code: Select all

Structure TValues 
  Gadget.i  
  StructureUnion
    intValue.i 
    realValue.d 
  EndStructureUnion
EndStructure 

#Gadgets_Max = 10 


Dim Values.TValues(#Gadgets_Max) 


For nn = 0 To #Gadgets_Max 
; .... 
  ; s = ??? 
  Values(nn)\Gadget = StringGadget(#PB_Any, 110*s, 910*s, 50,2 0,"200",#PB_String_LowerCase) 
; .... 
Next nn 
; .... 

For nn = 0 To #Gadgets_Max 
; .... 
  Values(nn)\realValue = ValD(GetGadgetText(Values(nn)\Gadget)) 
; .... 
Next nn