Dave is right, threading won't help you. Remove it, and the Monitors. And put all painting code in the Paint handler. Here[^] is an article that gives the fundamentals; the examples use C#, the concepts are identical in VB.NET though.
I had a problem with something about my picturebox.paint_event constantly firing. Still to this day I am clueless as to why. I was about to post a new question in the vb discussion when I came across this discussion I started a while back. I wanted to let you know that link that you posted solved my problem.
My program would draw primitive shapes (circles, lines, letters, etc) onto a picturebox using gdi+, but like I said the picturebox.paint_event would always trigger. This would peg one of my cpus at 100%, rather annoying. After making the changes that website you posted suggested the results are like night and day. Instead of the picturebox I used a panel and the paint_event only triggers when it should be triggered.
I just wanted to circle back and say thanks! Even though quite some time has passed
Forgive me I am a retired doctor and am just learning programming. I am playing with a small routine that will display number, and signs in rolling boxes to create a kind of slot machine effect to teach my granddaughter math.
I have listed the code below I am having a problem with. It will display the first set of pictures when I click on the button but will not display the pictures in the image list as it randomly selects them.
When I click the next three are moved and displayed but using a loop or a go to statement never works.
I do set the pictures to a default value prior to this routine.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
First, using goto is akin to farting loudly in church. You just don't do it.
It doesn't work because your code is hogging the UI thread. This means that since your code isn't giving up control the UI thread can't process the PAINT messages that are coming into your app from Windows (updating the image you see on screen). The end result it that you only see the last image you set when your loop is done.
How do you get around this?? Forget the loop and use a Timer. Set the Timer to fire an event every 250 milliseconds or so. Start (enable) the Timer in your button Click event.
When your code to change which frame you see will be in the Timer.Tick event. Something like this:
Private RNG As New Random
Private Sub MyTimer_Tick(...) Handles MyTimer.Tick
Dim index As Integer = RNG.Next(0, ImageList3.Images.Count)
PictureBox3.Image = PictureBox2.Image
PictureBox2.Image = PictureBox1.Image
PictureBox1.Image = ImageList3.Images(index)
Second I feel a dumb as a rock. Being a retired
doctor I thought programming would come a lot
easier to me.
I understand part of what your saying...
That being I have to give the the system time to
update the screen to allow the images to be painted
and seen before the next image appears.
Also I understand how to add the timer and set the value however, I am a little perplexed as to how to call the timer. Do I need to loop back each time until all the images have been displayed? And if so how and where do I call the timer to allow the delay? That is a delay after each image or just after each set?
A timer periodically fires an event, that is its job. And it is your code that deals with such event, that is what the "Handles myTimer.Tick" says in Dave's code snippet. So you don't provide the looping, the timer does that; you just tell it what to do each time.
I understand that I need to slow the process down
and let the images be painted to the screen so each can be seen before it continues to the next image.
I also understand that the timer will do that...
Where I am getting lost is how you call the timer into action. I created it and set the value as suggested to 250. But do I place the code line prior to displaying any image images?
Further, I need to repeat this paint 1,2,3
over and over until the a random timer stops the images from being chosen and displayed.
At this point every time I press the SPIN KEY, or button as it were the images are selected, displayed and with every click they move down one image. Placing a loop, jump or any other kind of repeating function kills the display of any image until the last one, then that is displayed, hence the need for a delay so they can be painted.
If I understand right the timer only need to be activated once and it will fire on its own after that correct? Or do I need to reset the value after each use?
- create an instance of System.Windows.Forms.Timer
- set its Interval in milliseconds
- give it a Tick handler (a method that "Handles ...Tick"
- launch it by calling its Start method
- DONE: the tick handler will be executed periodically until you explicitly stop the timer.
Yes, the .NET timers are "free running" by default: once started, they keep "ticking" until you stop them. And you can change their Interval any time you like, in case you want the wheels to slow down.
any delay you want is built in the timer, that is what the Interval property is for (e.g. for your alarm clock, the Interval would be 24 hours).
What you need is a "state variable", i.e. one or more data items that know how far your machine has moved. Say you start the timer inside the SpinButton_Click handler, and set a variable "digit" to 0.
Now inside the timer's Tick Handler, you increment "digit" (up to its maximum value, then reset it to zero), and order a repaint of your Form (or a reload of an image in a PictureBox), where the new content depends on "digit". That will make the wheels spin, until you decide it was enough, so you probably need a random number "maxTicks", and after maxTicks ticks of the timer, you stop the timer, and hence the wheels.
I'd like to amplify the other excellent answers a bit.
I am a VB 6 programmer so I may refer to methods that have changed but they are described in the Help.
You need to have a timer to slow down the process.
Whenever the timer acts, you need to
1 - load the image into the picturebox picturebox.image=...
2 - refresh the picturebox by calling the Refresh picturebox.refresh (may also be Redraw check the Help)
3 - let Windows process the action. application.DoEvents
Its the DoEvents directive that causes Windows to suspend the current thread and process all messages i.e. the picturebox.Refresh method will be executed.
Search the DoEvents in Help for an excellent discussion and sample code. The sample uses a click event from a button but you can just as easily control the process with a timer.
Your images should change whenever the timer ticks.
A big THANK YOU to everyone who helped with my problem.
After taking everyone's suggestions I played around with the code and now
have it working just fine. As well I learned a lot from suggestions and
trying different things about the timers and how they work.
By the end of the weekend I should have a working program...
There is no need for PictureBox.Refresh() or anything of that nature, by assigning a new image to the picturebox it knows it needs to repaint itself and it will.
And Application.DoEvents() is evil except maybe in the hands of experts; whenever your app seems to behave better with it, you probably have done it all wrong to begin with. Do not tell other people to use it!
hi, my senior told me to use DevShock dll in vb.net so i can easily do networking program.
but why everytime i search devshock.net in google, i keep finding thing like asp.net.
please help me, what should i type in google..
Hi guys I need your smart hands to handle this code
I have three columns on (Table1DataGridView) take names: (F/T) (Last name1) (Last name2)
first column takes Bit value ( Checkedbox. true or false ) the rest of columns takes text value type.
I wonder how can I do something like this : if F/T is checked true then Last name1 equuleus the value of Last name2
I try this
PrivateSub Table1DataGridView_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Table1DataGridView.CellContentClick
If Table1DataGridView.Rows(0).Cells(0).Value.chcked =True Then
then I thought I should know what is the name of F/T column and using that name to give that name my code which is las name1 = last name2
and I did this, I went to ( Edit columns option and then I copy the name of F/T column, and the Name of las nmae1,and the Name of las nmae2 ) and I did this code but I got nothing
If DataGridViewCheckBoxColumn1.TrueValue Then
DataGridViewTextBoxColumn2 = DataGridViewTextBoxColumn3
I'm not sure if can did this or it's not possible, Please if you could give hand with this I will be appreciated