|
My ram is getting eaten. The garbage fills up and then empties once my RAM fills. What is wrong with my code?
Imports System.Drawing
Dim startX As Int16
Dim endX As Int16
Dim startY As Int16
Dim endY As Int16
Dim m_Drawing As Boolean
Dim EraserOn As Boolean
Dim MyPen As New Pen(Color.Black)
Dim m_Drawn As Bitmap
Dim pic1 As Bitmap
Dim m_Graphics As Graphics
Dim m_Graphics2 As Graphics
Private Sub lblPaint_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles lblPaint.Paint
RenderIt()
End Sub
Private Sub lblPaint_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lblPaint.MouseDown
m_Drawing = True
startX = e.X
startY = e.Y
End Sub
Private Sub lblPaint_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lblPaint.MouseUp
endX = e.X
endY = e.Y
If m_Drawing = False Then
lblPaint.Refresh()
End If
m_Drawing = False
End Sub
Private Sub lblPaint_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lblPaint.MouseMove
If m_Drawing Then
m_Graphics.DrawLine(MyPen, startX, startY, e.X, e.Y)
startX = e.X
startY = e.Y
m_Graphics2.DrawImage(m_Drawn, 0, 0)
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
pic1 = Win32Util.Win32Window.DesktopAsBitmap
lblPaint.Image = pic1
m_Drawn = New Bitmap(pic1.Width, pic1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
m_Graphics = Graphics.FromImage(m_Drawn)
m_Graphics2 = lblPaint.CreateGraphics()
EraserOn = False
MyPen.Width = 4
End Sub
Private Sub RenderIt()
'Render Image then place Drawing on top
m_Graphics2.DrawImage(pic1, 0, 0)
m_Graphics2.DrawImage(m_Drawn, 0, 0)
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
pic1 = Win32Util.Win32Window.DesktopAsBitmap
RenderIt()
End Sub
This code takes a screenshot and allows me to draw on the label (lblPaint) while the screenshot refreshes.
|
|
|
|
|
Well, for one, you're creating two graphics objects and using them "globally" in your form and never disposing them. This is a VERY BAD idea. Proper practice is to create a Graphics object, use it to draw on your surface, then dispose it. This code needs a SERIOUS "scrap it and rewrite" to get this to work properly.
I take it you're trying to draw "rubber band" line from the MouseDown coords to the MouseUp coords and have it stay painted when your done?
What's up with this timer?
What is this code supposed to be doing?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I am trying to take a screenshot of what is behind the form when maximized. The timer just takes screenshots at an interval and continually adds them to the lblPaint. While the screenshots are being refreshed at the timer interval, I am able to draw a freehand line on the lblPaint.
Even still the screenshot won't capture anything behind the form. It captures the form as well.
At this point I am totally confused and I don't know what to do. Please help me
|
|
|
|
|
j_jd wrote: The timer just takes screenshots at an interval and continually adds them to the lblPaint.
That's one of your problems - you are creating too many Bitmap and Graphics objects which all take up memory.
You need to redesign the program and use some basic housekeeping code to clean up the objects you create.
...Steve
"Give a man a fish and you've fed him for a day. Teach him how to fish and you've fed him for life." (Translation: I'll show you the way, but not write the code for you.) I read that somewhere once
|
|
|
|
|
Steve's right. Your code is leaking like mad.
You can't see what's behind the form because a) It's never drawn to begin with, b) Your form will obscure anything behind it, causing A.
Why are you constantly taking screen shots while you're drawing lines? I don't see a purpose in it at all.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
j_jd wrote: What is wrong with my code?
You are not releasing memory used by the Bitmap and Graphics objects and therefore have created a memory leak.
You need to call the Dispose() method on all objects that support it to release resources when no longer needed.
...Steve
"Give a man a fish and you've fed him for a day. Teach him how to fish and you've fed him for life." (Translation: I'll show you the way, but not write the code for you.) I read that somewhere once
|
|
|
|
|
Hi, I am inserting current date and time in separate fields for every record inserted or modified. The records are correctly updated in the access database. However, the same is not reflected in the datagrid where the inserted or updated data is displayed. The date appears correct, but the time appears as some date. Please help.
With Best Regards,
Mayur
|
|
|
|
|
Hi VB friends,
I know a file name, say abc.exe. How do i know where it is? I mean how do I know which drive, folder it resides?
How to write a file abc.txt to the directory in which the abc.exe resides?
Thanks,
Joy Anne
|
|
|
|
|
If all you have is a filename, then you have to recursively search the entire hard drive to find it. THere is no one place that tells you what directory every file is in.
Now, if you're saying that abc.exe is your application and it needs to know what folder it was launched from, the you can use the Application.StartupPath property to find out.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hi Dave,
Thank you for the reply.
I couldn't find a proper example to show me how to use the Application.StartupPath. Can you please show me one? Thanks a lot.
Joy Anne
|
|
|
|
|
Have you tried something like a MessageBox to show you what it returns?
Private Sub Form1_Load(blah, blah) blah
MsgBox(Application.StartupPath)
End Sub
Combining it with another directory or filename is easy:
Imports System.Io
.
.
.
Dim myFilePath As String
myFilePath = Path.Combine(Application.StartupPath, "myFileName.txt")
MsgBox(myFilePath)
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
how could i implement certain searching algo into my application such as boyer moore algo.could sumbody help.
|
|
|
|
|
what is the best or easiest way to lower the amount of memory that a program uses?
- Kyle
|
|
|
|
|
Rewrite the app to be most efficient.
Other than that, you can temporarily lower the memory requirements, but it'll creep back up while you use your application. The CLR does a very good job at managing memory.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Is there a command that will close a program and all its forms. Right now i have a program that wont close when all the forms are gone. I am using this code to switch from form to form:
Dim f As New Form2
f.StartPosition = FormStartPosition.Manual
f.Location = Me.Location
f.Show()
Me.Hide()
Thanks.
|
|
|
|
|
the command 'Application.Exit()' will completly close the program
- Kyle
|
|
|
|
|
Ummm...Me.Hide() doesn't close the form, it just makes it invisible. You're app is apparently still running because you never closed all your forms, active, invisible, or otherwise.
In order to shutdown your app, you must close your startup form. This form starts the message pump for you application. Since your app is still running, this means that the app's message pump is still running. If the message pump is still running, you never closed your startup form.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
to completly close your program you can use following commands
'(To close all form and exit but not other threads)
Application.Exit
OR
'(To close all forms and threads)
Application.ExitThread()
!alien!
|
|
|
|
|
I know that. I'm just explaining WHY his app didn't close.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Thanks for your help and the explination.
|
|
|
|
|
I want to create a virtual serial port from my program, so I can send out serial data. I want my program to simulate an actual physical device, such as a GPS or Gyro, for testing purposes. I have seen many comercial programs that create two virual ports, and connect them, but I want just my program to expose itself as a serial port.
Ross King
------------------------
"Beer. Not just for breakfast anymore"
|
|
|
|
|
Ross, I just Googled "virtual serial port vb" and there were quite a few hits - some of which point to free controls for this purpose. Maybe one of those will do the job for you.
...Steve
"Give a man a fish and you've fed him for a day. Teach him how to fish and you've fed him for life." (Translation: I'll show you the way, but not write the code for you.) I read that somewhere once
|
|
|
|
|
Thanks Steve,
...but I spend yesterday afternoon doing a full google search, using every combination of terms I could think of. None of the controls that come up in google are actually free, and I want more control than those commerical ones allow. Most of the controls you find do a background creation of two virtual ports, so you can write to one, but I want to plug in somewhere in the middle.
Ross King
-----------------------------
"Beer, not just for breakfast anymore"
|
|
|
|
|
|