Invalid Memory Access

Just starting out? Need help? Post your questions and find answers here.
User avatar
matalog
Enthusiast
Enthusiast
Posts: 305
Joined: Tue Sep 05, 2017 10:07 am

Invalid Memory Access

Post 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?
Axolotl
Addict
Addict
Posts: 873
Joined: Wed Dec 31, 2008 3:36 pm

Re: Invalid Memory Access

Post 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.
Just because it worked doesn't mean it works.
PureBasic 6.04 (x86) and <latest stable version and current alpha/beta> (x64) on Windows 11 Home. Now started with Linux (VM: Ubuntu 22.04).
User avatar
matalog
Enthusiast
Enthusiast
Posts: 305
Joined: Tue Sep 05, 2017 10:07 am

Re: Invalid Memory Access

Post 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.
Axolotl
Addict
Addict
Posts: 873
Joined: Wed Dec 31, 2008 3:36 pm

Re: Invalid Memory Access

Post 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 
Just because it worked doesn't mean it works.
PureBasic 6.04 (x86) and <latest stable version and current alpha/beta> (x64) on Windows 11 Home. Now started with Linux (VM: Ubuntu 22.04).
Post Reply