By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,382 Members | 2,071 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,382 IT Pros & Developers. It's quick & easy.

Adding ActiveX controls at runtime and threading

P: n/a
In short we have a lengthy process when a form is loaded that adds
activex controls to our windows form. This process in itself works
fine however we would like to push this processing to a thread but are
stumped so far.

Our goal is simply to allow the form to fully display while the
controls are being added. Preferrably with a progressbar to let them
know that the form is still being built.

Here are some snippets.

Private Sub Form_Shown(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Shown
Dim myThread As Threading.Thread
myThread = New Threading.Thread(AddressOf load_udfSections)
myThread.SetApartmentState(Threading.ApartmentStat e.STA)
myThread.Start()
End Sub

Private Sub load_udfSections()
...
udfSection = New AxTdF_DynamicUDF.AxDynUDF

udfSection.BeginInit()
udfSection.Anchor =
CType(((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right),
System.Windows.Forms.AnchorStyles)
udfSection.Enabled = True
udfSection.Visible = False
udfSection.Location = New
System.Drawing.Point(ToolStripContainer1.ContentPa nel.Margin.Left,
currentTop)
udfSection.Name = "AxDynUDF" & CStr(controlIndex + 1)

With ToolStripContainer1.ContentPanel
axWidth = .Width - (.Margin.Left + .Margin.Right)
End With

udfSection.Size = New System.Drawing.Size(axWidth, 1)

ToolStripContainer1.ContentPanel.Invoke(New
addControl(AddressOf addControlToToolstrip), udfSection)
udfSection.EndInit()

udfSection.load_Controls(CShort(reader("ControlGro upID")), True)

.....
End Sub
There is a delegate called addcontroltoToolstrip for the following
function.

Private Sub addControlToToolstrip(ByVal activexControl As
AxTdF_DynamicUDF.AxDynUDF)
ToolStripContainer1.ContentPanel.Controls.Add(acti vexControl)
End Function

The invoke on the toolstrip seems to work fine but then when we try to
call endinit() it errors telling us that the control has been modified
in a different thread.

Any ideas? Only been using .NET for a week so there is no chance of
offending me. In VB6 we would have just started a timer in the show
event of the form which would let the event exit and then the timer
would process our lengthy code. Ugly but it at least allowed the form
to fully display before adding the remaining controls. Looking for
something a little bit more interactive.

Glenn Welker
Jun 26 '06 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On Mon, 26 Jun 2006 08:47:53 -0400, Toe Dipper
<to*******@discussions.microsoft.com> wrote:
In short we have a lengthy process when a form is loaded that adds
activex controls to our windows form. This process in itself works
fine however we would like to push this processing to a thread but are
stumped so far.

Our goal is simply to allow the form to fully display while the
controls are being added. Preferrably with a progressbar to let them
know that the form is still being built.

Here are some snippets.

Private Sub Form_Shown(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Shown
Dim myThread As Threading.Thread
myThread = New Threading.Thread(AddressOf load_udfSections)
myThread.SetApartmentState(Threading.ApartmentStat e.STA)
myThread.Start()
End Sub

Private Sub load_udfSections()
...
udfSection = New AxTdF_DynamicUDF.AxDynUDF

udfSection.BeginInit()
udfSection.Anchor =
CType(((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right),
System.Windows.Forms.AnchorStyles)
udfSection.Enabled = True
udfSection.Visible = False
udfSection.Location = New
System.Drawing.Point(ToolStripContainer1.ContentP anel.Margin.Left,
currentTop)
udfSection.Name = "AxDynUDF" & CStr(controlIndex + 1)

With ToolStripContainer1.ContentPanel
axWidth = .Width - (.Margin.Left + .Margin.Right)
End With

udfSection.Size = New System.Drawing.Size(axWidth, 1)

ToolStripContainer1.ContentPanel.Invoke(New
addControl(AddressOf addControlToToolstrip), udfSection)
udfSection.EndInit()

udfSection.load_Controls(CShort(reader("ControlGro upID")), True)

.....
End Sub
There is a delegate called addcontroltoToolstrip for the following
function.

Private Sub addControlToToolstrip(ByVal activexControl As
AxTdF_DynamicUDF.AxDynUDF)
ToolStripContainer1.ContentPanel.Controls.Add(acti vexControl)
End Function

The invoke on the toolstrip seems to work fine but then when we try to
call endinit() it errors telling us that the control has been modified
in a different thread.

Any ideas? Only been using .NET for a week so there is no chance of
offending me. In VB6 we would have just started a timer in the show
event of the form which would let the event exit and then the timer
would process our lengthy code. Ugly but it at least allowed the form
to fully display before adding the remaining controls. Looking for
something a little bit more interactive.

Glenn Welker


Based on what you posted, you are essentially continuing what would
normally happen in the Load Event, so I'm not sure why you want to use
a separate thread to continue loading controls. Is there some other
background process going on that is not shown in your code?

In VB6, I used a similar concept which worked fine - show the main
form ASAP, then continue with the load event. In VB2005, my
experience, so far, hs been that this is a bit more difficult to
implement from app to app as, in some cases, the main form has a
tendency to do an undesirable repaint when adding and positioning
controls after the main form is visible particularly when I have code
in the Layout Event.

Gene

Jun 26 '06 #2

P: n/a

Based on what you posted, you are essentially continuing what would
normally happen in the Load Event, so I'm not sure why you want to use
a separate thread to continue loading controls. Is there some other
background process going on that is not shown in your code?

In VB6, I used a similar concept which worked fine - show the main
form ASAP, then continue with the load event. In VB2005, my
experience, so far, hs been that this is a bit more difficult to
implement from app to app as, in some cases, the main form has a
tendency to do an undesirable repaint when adding and positioning
controls after the main form is visible particularly when I have code
in the Layout Event.

Gene


We were really just trying to clean up a hack that has been in our
code too long.

You are right we are trying to continue the load event. The code I
have referenced takes up to 10 seconds. Without any progress
indication to the user, it appears that the form has locked up. It
seemed like I could load the controls in a background process while
updating a progress bar in the main thread. This would have enabled
the user to move the gui and get feedback on the progress while the
background process finished.

Our solution for VB6 seems to be less robust under vb 2005. Since the
documentation for doevents points to multithreading it seems possible,
although quite complicated.

I appreciate your feedback.
Jun 27 '06 #3

P: n/a
On Tue, 27 Jun 2006 09:13:18 -0400, Toe Dipper
<to*******@discussions.microsoft.com> wrote:

Based on what you posted, you are essentially continuing what would
normally happen in the Load Event, so I'm not sure why you want to use
a separate thread to continue loading controls. Is there some other
background process going on that is not shown in your code?

In VB6, I used a similar concept which worked fine - show the main
form ASAP, then continue with the load event. In VB2005, my
experience, so far, hs been that this is a bit more difficult to
implement from app to app as, in some cases, the main form has a
tendency to do an undesirable repaint when adding and positioning
controls after the main form is visible particularly when I have code
in the Layout Event.

Gene


We were really just trying to clean up a hack that has been in our
code too long.

You are right we are trying to continue the load event. The code I
have referenced takes up to 10 seconds. Without any progress
indication to the user, it appears that the form has locked up. It
seemed like I could load the controls in a background process while
updating a progress bar in the main thread. This would have enabled
the user to move the gui and get feedback on the progress while the
background process finished.

Our solution for VB6 seems to be less robust under vb 2005. Since the
documentation for doevents points to multithreading it seems possible,
although quite complicated.

I appreciate your feedback.


A common technique for a long load time (10 seconds is long) is to
display a sort of spash screen (not the VB2005 splash screen) as soon
as the main form is displayed where the splash form contains a label
that is updating iindicating to the user that there is activity.
PhotoShop is a good example if you are familiar with that program.

Gene
Jun 27 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.