Hi all.
I have encountered a "Cross-thread operation not valid" error in a
test program I created and although I have came up with a solution I
don't like the performance of the program.
I hope perhaps some experts here can help me out.
Here is what my program consists of:
1) A form containng several tabs, one of which contains a ListView
control named "lvwFileList" and two buttons control to start and stops
a background process.
2) The backgroun process is done using the BackgroundWorkder control
and it calls a procedure named "ProcessFileList" which loops through
all items in the ListView control on the main form.
Here is my revision 1 of the procedure:
Private Sub ProcessFileList
Dim lvwItem as ListViewItem
For Each lvwItem in lvwFileList
'do some processing and update the ListView control
Next lvwItem
End Sub
Calling this procedure from a BackgroundWorker thread will result in a
"Cross-thread operation not valid"" error when the procedure attempts
to access "lvwFileList".
My next revision of the procedure uses methdodinvoke to get around the
"cross-thread" error:
Private Sub ProcessFileList
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf ProcessFileList))
Else
Dim lvwItem as ListViewItem
For Each lvwItem in lvwFileList
'do some processing and update the ListView control
Next lvwItem
End If
End Sub
This procedure will invoke a delegate method to run in the main form's
thread and therefore can access the listview control directly. The
process will run but the main form's interface becomes unresponsive
unless I insert Application.Doevents() into the loop. But even with
Application.Doevents inserted, the form's user interface is still
sluggish. For example, jumping between different tabs on the form
takes about 2-3 seconds after each mouse click. FYI, the loop process
itsef does not use much CPU resources. According to Windows Task
Manager, the process contributed to only 3% of CPU utilization.
Does anyone know a better way to access a control from a
backgroundwoker thread?
Is it possible to create a delegate to a control?
I am interested in a solution that allows me to continue to use the
For ... Each statement to process and update the listview.
Something like "For Each lvwItem In ListviewDelegate".
I already know how to access individual list view items in the by
using a delegate method. If I do that I will be forced to call the
delegate method in the loop for every listview item I want to access.
Also I will have to get the nubmer of listview items first and use the
regular For ... Next in the loop instead.
The reason I prefer the For ... Each loop is because I have a
FileSystemWatcher process running in the background that will add or
remove items from the listview control automatically. So if new items
are added to the listview control during the For ... Each loop
processing, they will also be included in the processing as long as
the For ... Each loop has not finished.
If there is no way to use For ... Each statement the way I would like,
I guess I will need to figure out how to make the main form more
responsive using my current approach.
Any comments or suggestions would be appreciated.
Thank you.
Jason 5 3539 no****@nospam.com wrote in news:8m********************************@4ax.com:
Does anyone know a better way to access a control from a
backgroundwoker thread?
Is it possible to create a delegate to a control?
You only need to "invoke" when updating something on the form.
Thus, if the majority of your background thread is looping, calculating,
fetching data... then you can only call "invoke" when you update an element
(i.e. set an item text property etc.).
Well this can be solved verry easy , just load the items in a array , data
table , hashtable or whatever
pefform your operations with the items in this .
as last action you set them to the listview control for your user to see
with a delagate
regards
Michel
<no****@nospam.comschreef in bericht
news:8m********************************@4ax.com...
Hi all.
I have encountered a "Cross-thread operation not valid" error in a
test program I created and although I have came up with a solution I
don't like the performance of the program.
I hope perhaps some experts here can help me out.
Here is what my program consists of:
1) A form containng several tabs, one of which contains a ListView
control named "lvwFileList" and two buttons control to start and stops
a background process.
2) The backgroun process is done using the BackgroundWorkder control
and it calls a procedure named "ProcessFileList" which loops through
all items in the ListView control on the main form.
Here is my revision 1 of the procedure:
Private Sub ProcessFileList
Dim lvwItem as ListViewItem
For Each lvwItem in lvwFileList
'do some processing and update the ListView control
Next lvwItem
End Sub
Calling this procedure from a BackgroundWorker thread will result in a
"Cross-thread operation not valid"" error when the procedure attempts
to access "lvwFileList".
My next revision of the procedure uses methdodinvoke to get around the
"cross-thread" error:
Private Sub ProcessFileList
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf ProcessFileList))
Else
Dim lvwItem as ListViewItem
For Each lvwItem in lvwFileList
'do some processing and update the ListView control
Next lvwItem
End If
End Sub
This procedure will invoke a delegate method to run in the main form's
thread and therefore can access the listview control directly. The
process will run but the main form's interface becomes unresponsive
unless I insert Application.Doevents() into the loop. But even with
Application.Doevents inserted, the form's user interface is still
sluggish. For example, jumping between different tabs on the form
takes about 2-3 seconds after each mouse click. FYI, the loop process
itsef does not use much CPU resources. According to Windows Task
Manager, the process contributed to only 3% of CPU utilization.
Does anyone know a better way to access a control from a
backgroundwoker thread?
Is it possible to create a delegate to a control?
I am interested in a solution that allows me to continue to use the
For ... Each statement to process and update the listview.
Something like "For Each lvwItem In ListviewDelegate".
I already know how to access individual list view items in the by
using a delegate method. If I do that I will be forced to call the
delegate method in the loop for every listview item I want to access.
Also I will have to get the nubmer of listview items first and use the
regular For ... Next in the loop instead.
The reason I prefer the For ... Each loop is because I have a
FileSystemWatcher process running in the background that will add or
remove items from the listview control automatically. So if new items
are added to the listview control during the For ... Each loop
processing, they will also be included in the processing as long as
the For ... Each loop has not finished.
If there is no way to use For ... Each statement the way I would like,
I guess I will need to figure out how to make the main form more
responsive using my current approach.
Any comments or suggestions would be appreciated.
Thank you.
Jason
On Fri, 09 Feb 2007 22:03:42 GMT, Spam Catcher
<sp**********@rogers.comwrote:
>You only need to "invoke" when updating something on the form.
Thus, if the majority of your background thread is looping, calculating, fetching data... then you can only call "invoke" when you update an element (i.e. set an item text property etc.).
Okay.
I ended up creating several methods which I invoke in my loop using
the main form's thread whenever I need to read, update, set item
color, and so on in the listview control. It looks messy but it
works.
Thanks for the suggestion.
Jason
On Sat, 10 Feb 2007 09:57:47 +0100, "Michel Posseth [MCP]"
<ms****@posseth.comwrote:
> Well this can be solved verry easy , just load the items in a array , data table , hashtable or whatever pefform your operations with the items in this .
as last action you set them to the listview control for your user to see with a delagate
You approach would work for me except I have to change font colors on
certain items in the listview. Instead of creating another array to
keep track of item colors, I just invoke different methods in my loop
to set color directly on the listview.
Thanks for the suggestion though.
Jason no****@nospam.com wrote in news:fd********************************@4ax.com:
I ended up creating several methods which I invoke in my loop using
the main form's thread whenever I need to read, update, set item
color, and so on in the listview control. It looks messy but it
works.
Ya - that's how it like :-( This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Web Science |
last post by:
Site and Features: http://www.eigensearch.com
Search engine, eigenMethod, eigenvector, mathematical, manifolds, science, technical, search tools, eigenmath, Jacobian, quantum, mechanics,...
|
by: * ProteanThread * |
last post by:
but depends upon the clique:
...
|
by: rollasoc |
last post by:
Hi,
Doing a bit of system testing on a Windows 98 laptop. (.Net 1.1 app).
Did a bit of testing. Loaded a previously saved file. A gray box
appeared with the text and buttons all white...
|
by: Web Science |
last post by:
Site and Features: http://www.eigensearch.com
Search engine, eigenMethod, eigenvector, mathematical, manifolds, science, technical, search tools, eigenmath, Jacobian, quantum, mechanics,...
|
by: David Peach |
last post by:
Hello, hope somebody here can help me... I have a query that lists
defects recorded in a user defined date range. That query is then used
as the source for a Cross Tab query that cross-tabs count...
|
by: Web Science |
last post by:
Site and Features: http://www.eigensearch.com
Search engine, eigenMethod, eigenvector, mathematical, manifolds, science, technical, search tools, eigenmath, Jacobian, quantum, mechanics,...
|
by: Rob Woodworth |
last post by:
Hi,
I'm having serious problems getting my report to work. I need to
generate a timesheet report which will contain info for one employee between
certain dates (one week's worth of dates). I...
|
by: Simon |
last post by:
Hi All,
An experiment i'm doing requires requires a synchronous cross-domain
request, without using a proxy. I wondered if anyone had any ideas to
help me achieve this.
Below is what I have...
|
by: Bart Van der Donck |
last post by:
Hello,
I'm presenting my new library 'AJAX Cross Domain' - a javascript
extension that allows to perform cross-domain AJAX requests.
http://www.ajax-cross-domain.com/
Any comments or...
|
by: ampo |
last post by:
Hello.
Can anyone help with cross-domain problem?
I have HTML page from server1 that send xmlHTTPRequest to server2.
How can I do it?
Thanks.
|
by: DJRhino |
last post by:
Was curious if anyone else was having this same issue or not....
I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 4 Oct 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM)
The start time is equivalent to 19:00 (7PM) in Central...
|
by: Aliciasmith |
last post by:
In an age dominated by smartphones, having a mobile app for your business is no longer an option; it's a necessity. Whether you're a startup or an established enterprise, finding the right mobile app...
|
by: tracyyun |
last post by:
Hello everyone,
I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
|
by: giovanniandrean |
last post by:
The energy model is structured as follows and uses excel sheets to give input data:
1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
|
by: NeoPa |
last post by:
Hello everyone.
I find myself stuck trying to find the VBA way to get Access to create a PDF of the currently-selected (and open) object (Form or Report).
I know it can be done by selecting :...
|
by: nia12 |
last post by:
Hi there,
I am very new to Access so apologies if any of this is obvious/not clear.
I am creating a data collection tool for health care employees to complete. It consists of a number of...
|
by: NeoPa |
last post by:
Introduction
For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
|
by: GKJR |
last post by:
Does anyone have a recommendation to build a standalone application to replace an Access database? I have my bookkeeping software I developed in Access that I would like to make available to other...
| |