Home All Groups Group Topic Archive Search About

BeginInvoke with a property?

Author
28 Apr 2006 6:02 PM
AMDRIT
Hello everyone,

How do I access a property from another thread in VB'05?  Thanks

public class frmblah
  inherits system.windows.forms.form

  private mCount as integer

  private property Count as integer
    get
      return mCount
    end get
    set (value as integer)
      mCount = value
    end set
  end property

  private sub updatecount
    if me.InvokeRequired then
        '
        '???????
        '
    else
      me.count += 1
    end if
  end sub

end class

Author
28 Apr 2006 6:15 PM
AMDRIT
Well, I am begininvoking the UpdateCount instead and it appears to be
working.


Show quoteHide quote
"AMDRIT" <amd***@hotmail.com> wrote in message
news:enmtp3uaGHA.3328@TK2MSFTNGP02.phx.gbl...
> Hello everyone,
>
> How do I access a property from another thread in VB'05?  Thanks
>
> public class frmblah
>  inherits system.windows.forms.form
>
>  private mCount as integer
>
>  private property Count as integer
>    get
>      return mCount
>    end get
>    set (value as integer)
>      mCount = value
>    end set
>  end property
>
>  private sub updatecount
>    if me.InvokeRequired then
>        '
>        '???????
>        '
>    else
>      me.count += 1
>    end if
>  end sub
>
> end class
>
Author
28 Apr 2006 7:37 PM
Brian Henry
This is for .NET not VB Classic, you might want to try a classic VB group
instead

Show quoteHide quote
"AMDRIT" <amd***@hotmail.com> wrote in message
news:OgL1l%23uaGHA.4520@TK2MSFTNGP03.phx.gbl...
> Well, I am begininvoking the UpdateCount instead and it appears to be
> working.
>
>
> "AMDRIT" <amd***@hotmail.com> wrote in message
> news:enmtp3uaGHA.3328@TK2MSFTNGP02.phx.gbl...
>> Hello everyone,
>>
>> How do I access a property from another thread in VB'05?  Thanks
>>
>> public class frmblah
>>  inherits system.windows.forms.form
>>
>>  private mCount as integer
>>
>>  private property Count as integer
>>    get
>>      return mCount
>>    end get
>>    set (value as integer)
>>      mCount = value
>>    end set
>>  end property
>>
>>  private sub updatecount
>>    if me.InvokeRequired then
>>        '
>>        '???????
>>        '
>>    else
>>      me.count += 1
>>    end if
>>  end sub
>>
>> end class
>>
>
>
Author
28 Apr 2006 10:19 PM
Herfried K. Wagner [MVP]
"Brian Henry" <nospam@nospam.com> schrieb:
> This is for .NET not VB Classic, you might want to try a classic VB group
> instead

Mhm...  The question is clearly related to VB.NET.

--
M S   Herfried K. Wagner
M V P  <URL:http://dotnet.mvps.org/>
V B   <URL:http://classicvb.org/petition/>
Author
28 Apr 2006 8:49 PM
david
On 2006-04-28, AMDRIT <amd***@hotmail.com> wrote:
Show quoteHide quote
> Hello everyone,
>
> How do I access a property from another thread in VB'05?  Thanks
>
> public class frmblah
>   inherits system.windows.forms.form
>
>   private mCount as integer
>
>   private property Count as integer
>     get
>       return mCount
>     end get
>     set (value as integer)
>       mCount = value
>     end set
>   end property
>
>   private sub updatecount
>     if me.InvokeRequired then
>         '
>         '???????
>         '
>     else
>       me.count += 1
>     end if
>   end sub
>
> end class

You don't need to worry about InvokeRequired here, that's for accessing
UI components on the UI thread.  For ordinary properties, even if they
are properties of a Form class, you can just set them from any thread
(watching out for thread contention of course).


Show quoteHide quote
>
>
Author
28 Apr 2006 9:34 PM
AMDRIT
David,

Thanks for the response.  The actual issue I am working through is a splash
screen.

I have a component library that has a base form and a splash screen form.
All my application forms derive from the custom form, which now has two
additional methods, (ShowWait, HideWait).  These methods will be used
primarly for long running processes called by the custom form, however, the
derived form could make use of it as well.

In VB'03 is was working great, my problem is in VB'05.  The splash screen is
supposed to fade in and out over time while it is displayed.  I encountered
two issues from the conversion.

1.  I do not have access to doevents.  Since control libraries do not have
access to the My namespace, I have been exploring
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase. I
haven't found a way to associate my ExecutingAssembly with my library.
Threading.Thread.Sleep doesn't seem to do the job, of cource that could be a
result of my second issue.

2.  Accessing the splash screens form methods and properties cause:
    a.  System.Threading.ThreadAbortException
    b.  System.ArgumentException
    c.  System.InvalidOperationException
    d.  System.Transactions Critical at
System.Windows.Forms.Control.SetVisibleCore(Boolean value)

What I have going on is a do...while loop that is calling the fade routine
when the splash screen is visible.

public sub DoFading
  do while not done
    call Fade
  loop

  me.hide()
  me.close()

end sub

private sub Fade

  dim fadedirection as fadetypes

  if me.opacity <= 0 then
   fadedirection = fadetypes.up
  elseif me.opacity >= 1 then
    fadedirection = fadetypes.down
  end if

  select case fadedirection
    case fadetypes.up
      me.opacity += pintStepping
    case else
       me.opacity -= pintStepping
  end select

end sub

I changed my call to fade to Me.Invoke(New
Windows.Forms.MethodInvoker(AddressOf Fade))

as well as the logic to hide and close the form

I don't know what I am doing wrong, but it is not behaving like it used to.

Show quoteHide quote
"david" <da***@woofix.local.dom> wrote in message
news:slrne55052.o10.david@localhost.localdomain...
> On 2006-04-28, AMDRIT <amd***@hotmail.com> wrote:
>> Hello everyone,
>>
>> How do I access a property from another thread in VB'05?  Thanks
>>
>> public class frmblah
>>   inherits system.windows.forms.form
>>
>>   private mCount as integer
>>
>>   private property Count as integer
>>     get
>>       return mCount
>>     end get
>>     set (value as integer)
>>       mCount = value
>>     end set
>>   end property
>>
>>   private sub updatecount
>>     if me.InvokeRequired then
>>         '
>>         '???????
>>         '
>>     else
>>       me.count += 1
>>     end if
>>   end sub
>>
>> end class
>
> You don't need to worry about InvokeRequired here, that's for accessing
> UI components on the UI thread.  For ordinary properties, even if they
> are properties of a Form class, you can just set them from any thread
> (watching out for thread contention of course).
>
>
>>
>>
Author
29 Apr 2006 5:14 AM
david
On 2006-04-28, AMDRIT <amd***@hotmail.com> wrote:
Show quoteHide quote
> David,
>
> Thanks for the response.  The actual issue I am working through is a splash
> screen.
>
> I have a component library that has a base form and a splash screen form.
> All my application forms derive from the custom form, which now has two
> additional methods, (ShowWait, HideWait).  These methods will be used
> primarly for long running processes called by the custom form, however, the
> derived form could make use of it as well.
>
> In VB'03 is was working great, my problem is in VB'05.  The splash screen is
> supposed to fade in and out over time while it is displayed.  I encountered
> two issues from the conversion.

VB05 is a bit more persnickety about calling UI components from the
wrong thread.
>
> 1.  I do not have access to doevents.  Since control libraries do not have
> access to the My namespace, I have been exploring
> Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase. I
> haven't found a way to associate my ExecutingAssembly with my library.

I'm not sure why you need doEvents here, but it can be found at
System.Windows.Forms.Application.DoEvents().

Of course, it needs to be called from the UI thread.


> Threading.Thread.Sleep doesn't seem to do the job, of cource that could be a
> result of my second issue.
>
> 2.  Accessing the splash screens form methods and properties cause:
>     a.  System.Threading.ThreadAbortException
>     b.  System.ArgumentException
>     c.  System.InvalidOperationException
>     d.  System.Transactions Critical at
> System.Windows.Forms.Control.SetVisibleCore(Boolean value)
>
> What I have going on is a do...while loop that is calling the fade routine
> when the splash screen is visible.

Seems like a timer would be more appropriate.  In fact, the Forms.Timer
component will even handle calling you on the correct thread.
Show quoteHide quote
>
> public sub DoFading
>   do while not done
>     call Fade
>   loop
>
>   me.hide()
>   me.close()
>
> end sub
>
> private sub Fade
>
>   dim fadedirection as fadetypes
>
>   if me.opacity <= 0 then
>    fadedirection = fadetypes.up
>   elseif me.opacity >= 1 then
>     fadedirection = fadetypes.down
>   end if
>
>   select case fadedirection
>     case fadetypes.up
>       me.opacity += pintStepping
>     case else
>        me.opacity -= pintStepping
>   end select
>
> end sub
>
> I changed my call to fade to Me.Invoke(New
> Windows.Forms.MethodInvoker(AddressOf Fade))
>
> as well as the logic to hide and close the form
>
> I don't know what I am doing wrong, but it is not behaving like it used to.

It's hard to tell from this snippet.  I'm not even sure the threading is
the error here is from the UI thread issues (usually you get an
InvalidOperationException when that happens).  One trick I like to do
for these types of problems is have the form methods handle their own
invoke requirements, like...


Private Sub Fade()
    If Me.InvokeRequired Then
        Me.Invoke(New MethodInvoker(AddressOf Fade))
        Exit Sub
    End If
    ' Do the real work





Show quoteHide quote
>
> "david" <da***@woofix.local.dom> wrote in message
> news:slrne55052.o10.david@localhost.localdomain...
>> On 2006-04-28, AMDRIT <amd***@hotmail.com> wrote:
>>> Hello everyone,
>>>
>>> How do I access a property from another thread in VB'05?  Thanks
>>>
>>> public class frmblah
>>>   inherits system.windows.forms.form
>>>
>>>   private mCount as integer
>>>
>>>   private property Count as integer
>>>     get
>>>       return mCount
>>>     end get
>>>     set (value as integer)
>>>       mCount = value
>>>     end set
>>>   end property
>>>
>>>   private sub updatecount
>>>     if me.InvokeRequired then
>>>         '
>>>         '???????
>>>         '
>>>     else
>>>       me.count += 1
>>>     end if
>>>   end sub
>>>
>>> end class
>>
>> You don't need to worry about InvokeRequired here, that's for accessing
>> UI components on the UI thread.  For ordinary properties, even if they
>> are properties of a Form class, you can just set them from any thread
>> (watching out for thread contention of course).
>>
>>
>>>
>>>
>
>
Author
29 Apr 2006 6:38 AM
Chris Chilvers
On Fri, 28 Apr 2006 16:34:12 -0500, "AMDRIT" <amd***@hotmail.com> wrote:

>1.  I do not have access to doevents. 

You don't need it if your fade code is running on a thread you've created.


Show quoteHide quote
>2.  Accessing the splash screens form methods and properties cause:
>    a.  System.Threading.ThreadAbortException
>    b.  System.ArgumentException
>    c.  System.InvalidOperationException
>    d.  System.Transactions Critical at
>System.Windows.Forms.Control.SetVisibleCore(Boolean value)
>
>What I have going on is a do...while loop that is calling the fade routine
>when the splash screen is visible.
>
>public sub DoFading
>  do while not done
>    Me.Invoke(New Windows.Forms.MethodInvoker(AddressOf Fade))
>  loop
>
>  me.hide()
>  me.close()
>
>end sub
>

If you look at that code (assuming you've wrapped that call to Fade() inside of an invoke like you described) you will
see that your calls to hide() and close() are not using a MethodInvoker. These calls need to be executed from the
controls thread and will need to be invoked as well:

public sub DoFading
  MethodInvoker fader = New MethodInvoker(AddressOf Fade)

  do while not done
    Me.Invoke(fader)
    'Really should think about a sleep here so as not to eat cpu time
  loop

  Me.Invoke(New MethodInvoker(AddressOf Close())
end sub

This is making the assumption you have launched DoFading on a new thread, which it seems like you have done.
Author
1 May 2006 2:38 PM
AMDRIT
Thanks David and Chris,  everything appears to be right again.

Show quoteHide quote
"Chris Chilvers" <kee***@dynafus.com> wrote in message
news:ov165212jbai81gps1fqvmau6bcl5nhd64@4ax.com...
> On Fri, 28 Apr 2006 16:34:12 -0500, "AMDRIT" <amd***@hotmail.com> wrote:
>
>>1.  I do not have access to doevents.
>
> You don't need it if your fade code is running on a thread you've created.
>
>
>>2.  Accessing the splash screens form methods and properties cause:
>>    a.  System.Threading.ThreadAbortException
>>    b.  System.ArgumentException
>>    c.  System.InvalidOperationException
>>    d.  System.Transactions Critical at
>>System.Windows.Forms.Control.SetVisibleCore(Boolean value)
>>
>>What I have going on is a do...while loop that is calling the fade routine
>>when the splash screen is visible.
>>
>>public sub DoFading
>>  do while not done
>>    Me.Invoke(New Windows.Forms.MethodInvoker(AddressOf Fade))
>>  loop
>>
>>  me.hide()
>>  me.close()
>>
>>end sub
>>
>
> If you look at that code (assuming you've wrapped that call to Fade()
> inside of an invoke like you described) you will
> see that your calls to hide() and close() are not using a MethodInvoker.
> These calls need to be executed from the
> controls thread and will need to be invoked as well:
>
> public sub DoFading
>  MethodInvoker fader = New MethodInvoker(AddressOf Fade)
>
>  do while not done
>    Me.Invoke(fader)
>    'Really should think about a sleep here so as not to eat cpu time
>  loop
>
>  Me.Invoke(New MethodInvoker(AddressOf Close())
> end sub
>
> This is making the assumption you have launched DoFading on a new thread,
> which it seems like you have done.