Multithreading - Two Different Approaches To Generic Cross-threaded Operations; Which Is Better?
Feb 15, 2011
I recently read about using SynchronizationContext objects to control the execution thread for some code. I have been using a generic subroutine to handle (possibly) cross-thread calls for things like updating UI controls that utilize Invoke. I'm an amateur and have a hard time understanding the pros and cons of any particular approach. I am looking for some insight on which approach might be preferable and why.Update: This question is motivated, in part, by statements such as the following from the MSDN page on Control.InvokeRequired
I want to execute a few external apps, where in between a RichTextBox gets updated.. Say when program1 has been startet the RichTextBox is updated.. And when program2 has been startet the RichTextBox is beeing updated again.So what i've done so far is this:
Public Class Form1 Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
[code]....
But when doing the above i get the following error:
Quote:
Cross-thread operation not valid: Control 'RichTextBox1' accessed from a thread other than the thread it was created on.
I was using the following code within a class and creating an instance of that class from within my main form (Main.vb):Dim count As Integer = Main.DbDataSet.Accounts.CountThis was returning the count of accounts within my database.After changing the code so that I could run this in a background thread to save locking up the program, as more data is processed after this point, the count was returning 0 each time.
I'm having a small issue; I start a process and when that process exits, I raise an event which removes a control from my form.It all works perfectly until the part where I want to remove a control from my form. Visual Studio gives me a cross-thread exception even though I'm programming single threaded.
I'm using Visual Basic 2010I've created a ListBox and a BackgroundWorker using designerI want to change the location of listbox using backgroundworker but I get the error as follows:"InvalidOperationException was Handled by user code:"Cross-thread operation not valid: Control 'ListBox1' accessed from a thread other than the thread it was created on
I have been using a pretty slick generic invoke method for UI updating from background threads. I forget where I copied it from (converted it to VB.NET from C#), but here it is: Public Sub InvokeControl(Of T As Control)(ByVal Control As t, ByVal Action As Action(Of t))
I am making use of a serial port in a class. I am raising an event from that class to my form calling the class. Event contains data received... I wish to simply populate a textbox from the raised event.Now I am not specifically creating a seperate thread, but I get the normal crossthreading error when trying to update my textbox on the UI, so my assumption is that the serial port and its internal methods probably creates its own threads...Regardless, I am a bit confused as to how to properly implement an invoke, from my main form, pointing to the thread in the instantiated class...
Dim WithEvents tmpRS232 As New clsRS232 Private Sub but_txt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles but_txt.Click tmpRS232.Set_com_port("COM8", 38400)
I am building a code library to be used by a 3rd party developer. Neither my code or the 3rd party have any UI controls involved. It's purpose is a combination of providing the ability to look up information from a database while at the same time polling it and throwing events when a set of conditions are met. Naturally the only way it's going to be responsive to the 3rd party library's commands is via multithreading since everything in a single thread stops once you start polling the database.
The sub I am using is part of an object that I create in the main thread and attempt to have it run via a thread, when a condition is met I have it update a property in that object, throw the event (or execute a callback in my latest attempt) and then attempt to have a simulator for the 3rd party control read the property.It's easy to setup the multithreading part, the hard part appears to be throwing the event so it is seen in the original thread and the data is available there. Any attempt to do this generates a cross thread error when the data is read.
I attempted to use delegates and calling methods asynchronously and using the callback function but still get cross threading errors.Is my only possiblity to use a background worker, using either the progress changed or runworker completed events? Even then am I going to be able to set the property in the function from one thread and read it in another?
I'm having difficulty in working with MultiThreading.I want to add to my project a ProgressBar to show the working flow.I'm getting combinations from many Strings, the number of combination can be really big, so it takes few seconds or minutes.
The error occurs at: For i As Integer = 0 To txt_load.Lines.Count - 1..The project exists of 2 rtb's. One with a list of lines. The other will be filled with the converted lines. The main reason that I use it is that I want to use the app during the conversion. The second is that I want to learn how this works.[code]
I am trying to implement a solution for updating form controls without using a delegate.
Imports System.ComponentModel Imports System.Runtime.CompilerServices Public Module MyInvoke
[code]....
I get a cross threading error as though i didnt even use this method:Cross-thread operation not valid: Control 'ComboBox1' accessed from a thread other than the thread it was created on.
I have a small application that is currently released. It does not use any database technologies. I built into it some simple copy protection that allows the app to run as a 10 day trial. After this it needs a licence number that I generate based on a code my app provides to the user.This works great for one or two standalone machines but I am now being asked about more flexible pre activated site licencing. Currently this is a bit beyond my skills. I need pointing in the right direction. I assume if I remove my copyprotection and install on a network share, that my app will run.My app also stores some data in the registry which includes the serial number and copy protection data. I could probably switch this to a local file if this helps.What approaches are there for networking my app and copyprotecting it at the same time?
We have migrated our Vb6 application to VB.NET using a third party tool. Now we are in a process of Refactoring and introducing object oriented concepts in the application.
In VB6, we were using structures in many places. As a part of introducing object oriented programming,
1. is it a good idea of changing all Structures to Classes? or Is there a concept of "Generic Structure" similar to Generic collections, Generic classes?
2. Can some one guide me any source containing guide lines or best practices for applications that are migrated to VB.NET from VB6 and implementing object oriented programmaing.
Public MustInherit Class Column Public ReadOnly Property ReturnSomethingUseful() As Object Get 'return something useful
[code]....
But this gives the following error:
Public Overrides Function ParseValue(sValue As String) As Boolean' cannot override 'Public Overridable Function ParseValue(sValue As String) As Object' because they differ by their return types.
I accept that you can't do this, but I'd like to be able to preserve the semantics of what I'm. trying to do, which is to have an untyped version that deals with Object, but a typed version in derived classes that knows about the specific type T.
I am trying to construct a generic interface class with generic functions. My goal was to use this to implement multiple worker classes for database interaction that have the same basic functionality. Each class will deal with different object for example, category, product or supplier but unless the the functions in the interface are generic that this won't work.This is the interface code that I have but I don't know if I have done it correctly. [code]
I am trying to create a list of a generic type in vb.net 2.0 framework. This is the generic type definition:
Public Class GenericParamMap(Of T) Public Sub New(ByVal pParamName As String, ByVal pPropValue As T) mParamName = pParamName
[Code]....
The compiler does not allow a "T" in the method's parameter because it's not defined, but I'm not sure how or where to define it. I thought it was okay to have a generic method definition.
I am trying to write a generic method, to avoid code duplication, which will create or activate a Form as an MDI children, based on its type. But I have to lines in error (see comments).
i created a threaded form class that i call when i know an update is going to take a while....it is a simple form with a label and an animated marquee progress control. the code is listed at the bottom....whenever i try to set the message, it says i cant do it with error "{System.InvalidOperationException: Cross-thread operation not valid: Control 'MessageLabel' accessed from a thread other than the thread it was created on." from my form (in my SAVE function, i put the following line:[code]....
I'm trying to run a multi-threaded console app in VB and am having thread cross-over. Basically I want to run 5 threads, have them continually access a queue, process, and repeat until there's nothing left. When all threads have processed I want them to do something else.I'm attempting to use SyncLock to prevent multiple threads from accessing but it does not seem to be working.[code]
Here is my webclient class that I am using to check multiple web sites at the same time. I am threading the class so each thread is creating a new getHtml Class. It seems that it still is waiting on something, because it only returns about 2 pages per second, which is great, but I think it should return faster if they are truly running on separate threads.When i made a similar perl script it would return 50 pages in about 10 seconds so it was much faster than this webclient method, unfortunately I don't want a cli. Let me know what you think. I have tried setting the proxy to null, but that didn't do anything.
Class getHtml Friend result Public Sub GetPage(ByVal URL As String)
I beleive I have asked a question similar in the past but I am re-visiting it with a slight difference and wonder if anyone can give advice.I am building a server app that when starts it opens a second 'listener' thread that when started will open up a listener on a port and wait. When a client connects it handles it and upon disconnects starts from the top and waits for the next client. Also once a client has connected its job is to look at a list of ports see what is free quickly respond with a port number setup another thread which then listens on the port number for the client.
At pretty much all times the 2nd thread will be stuck on a line waiting for a connection and at any one time there maybe more threads running waiting for a client to connect and if a client connects it never ends the thread as its stuck on a line of code.
Now currently if the service gets a request to stop it cannot stop the threads because they are just waiting on one line of code for a client to connect. I can easily set a varible to indicate the service is closing but they can only check that once a client is connected so the code is run.
What I either want is:
a) a way of force closing a thread from the main app thread or
b) a way for the line of code waiting for a client to connect to timeout after a certain amount of time.
I created an image-viewing control for my boss that incorporates panning, zooming via the mouse wheel, and drawing a box to zoom to. The control needs to support very large image files (i.e. several thousand pixels on each side).
It all works, but whenever the code is scaling the image the control UI becomes unresponsive. My boss had me use threading to set the scaling code apart from the UI. The scaling code is now definitely on a separate thread but the UI is still bogged down while scaling code is running!
I have some code that runs within a multithreaded class.Basically i create many threads which contain instance of this class.Within this class i create an object to either a vb6 or .net dll using reflection, then i call a method within that object. The object that gets called can be different every time.But for some reason even through i have multiple threads going when i get to the Activator.CreateInstance it is no longer multithreaded. I want to catch the error returned and put it in a log.
If UCase(pRow("TypeVB6").ToString()) = "TRUE" Then classType = Type.GetTypeFromProgID(ClasstoInstantiate, True) Else
I'm trying to teach myself how to create multi-threaded applications in Visual Basic Express 2008. I found a page headed "Creating Threads and Passing Data at Start Time" in the Library here -
[url]
However, I can't get any of the examples on that page to run. I pasted the code from an example into a new Project in my IDE but pressing F5 just gives me build errors which I have no idea how to resolve. It's probably something trivial but I can't progress with these examples. Please can somebody tell me what I need to add to get them to run
I am drawing five images in a row. The five are the same thing at five different zoom levels. Therefore, only one of the five will be displayed at any one time, but the others have to be there because there can be over 100 images being displayed on the screen at any one time, and each drawing is quite complicated. If I were to draw them all on the fly, then zooming would require that all 115 images be recreated and redrawn with each zoom. That's painful. To avoid that, I draw all five zoom levels of each image. When the user iteracts with the form, they will be interacting with, at most, two of the images, so when they interact with the form, only two of the 115 have to be redrawn, though those two have to have all five zoom levels drawn, for a total of 10 images.
I've just completed my first multi-threaded task under windows. Historically I am a VMS Engineer. You could multithread in drivers in VMS but VMS never had formalized threads. Which means it never had applications threads. Threads will become increasing important in the future. I thought this maybe a good time to discuss them. Not having access to sources hurts in terms of the amount of depth one can achieve in Windows. Some of the topics for this thread might be...compute resource regulation, how to do multi-threading and of course things to watch out for.