Find The Application Thread And Invoke Something On It?
Mar 1, 2012
I want to find the application thread and invoke something on it ... the problem is i have access to NO OBJECTS on the main thread so calling object.invoke is not an option. This is because I am making a plugin for something and have no access to the existing objects on the main thread .
We have a UI with a progressbar. I know how to invoke, safely, the control from which it was not created from a thread. there are threads being processed in a threadpool, all of which calls an "agent" (which is a notifier to raise an event back to the UI to then increase the progressbar). an "agent" is set as a property in a State object, which is then passed into a method which will be executed on the ThreadPool. so, I invoke on the UI the method to update the progressbar, but the bar does not seem to update at all (screen frozen) and it takes a very very long time for it to execute. without threading, no problem.
I'm trying to invoke the below but the EventHander is not compatible with the RasConnectionEventArgs from my calling event, how would I invoke SetOverlayIcon and my notification icon on the UI thread?
Public Sub watcher_Connected(ByVal sender As Object, ByVal e As RasConnectionEventArgs) If InvokeRequired Then BeginInvoke(New EventHandler(AddressOf OnRegChanged))
i got a background worker that has the following code in the do work.... one of the things i want to do is to add rows if theres none available ...but i got an error saying i need to do a safe call thread...i already read about it but im stuck i put control.invoke, but that gives me an error too saying Error 1 Reference to a non-shared member requires an object reference.
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 Have a Function on my frmMain Class wich will update my control to something else after an invoke. When i type "?Label1.Text" on the Immediate Window, the text property IS updated, but when i go check the Form, nothing happened. The code is just like this
i got a background worker that has the following code in the do work.... one of the things i want to do is to add rows if theres none available ...but i got an error saying i need to do a safe call thread...i already read about it but im stuck i put control.invoke, but that gives me an error too saying Error1Reference to a non-shared member requires an object reference.what can i do to add rows safely?
vb.net Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork If DataGridView2.Rows.Item(num).Cells.Item(0).Value = "" Then Control.Invoke(DataGridView2.Rows.Add(1))
I have created a class for Socket reads so I can create sockets on command. Due to performing a socket read, the program will freeze waiting for incoming data due to being on a single thread. So I created a separate thread for the reading of the sock and attempt to invoke an event to prevent multi-threading errors.
But I am getting an error when trying to Invoke: "Invoke or BeginInvoke cannot be called on a control until the window handle has been created."
How can I fix this or is there a better way to read a sock without freezing the thread?
Class for Sockets:
Option Explicit On Option Strict On
Imports System.Text
[CODE]...
Calling form code example:
Private WithEvents Socks As clsSock
Private Sub Sock_Connected(ByVal state As String) Handles Socks.Connected MsgBox("Connected - " & state)
The problem is that, when I call the "SetStatusBarText" sub from another thread, InvokeRequired is True (as it should be), but then my threads stall on the Me.Invoke statement - pausing execution shows them all just sitting there, not actually invoking anything.
I am getting this exception: Cross-thread operation not valid: Control 'TextBoxOutput' accessed from a thread other than the thread it was created on. in a VB 2008 Windows Forms application that I havent specifically made multi-threaded. I have create a sub called Out() like this:
Private Sub Out(ByVal inString As String) Me.TextBoxOutput.Text += (Me.TextBoxOutput.Text & inString & vbNewLine) Me.TextBoxOutput.SelectionStart = Me.TextBoxOutput.Text.Length Me.TextBoxOutput.ScrollToCaret() End Sub
and I call it from various events to log messages I am getting from my pbx, which I use a third party open source dll to access. The interesting thing to me is that if I run the deployed application (ie, not in the VS IDE) I do not get any exceptions, it's only from within the IDE.if I add the line: Control.CheckForIllegalCrossThreadCalls = False to the form's constructor, the exceptions stop, but a) this seems like a hacky way to get around the issue and b) the application seems to hang sometimes when I have it set this way.
I have a thread in an application which calls a sub routine Main(). The Main sub routine in turn call several sub routines/functions from with the same module,several different classes in the same application. Also some sub routines/functions call routines from a class library. Now say the routine/function in class library goes into a infinite loop and never returns. I would like my thread in the application to raise a event and display message to the users about the infinite loop. I am giving some sample code for the application.
My routine to check for updates is run as a separate process. Exiting the application is required to update, so a dialog asks the user, when an update is found, if they want to exit now. f they do, the code (from the update thread) calls Application.Exit().However, if the FormClosed event of any form that needs to be closed needs to access its controls, an invalid cross-thread operation is detected (which sounds pretty logical).
I have a filesystewatcher object. On it`s event it runs a procedure which fills a treeview with a data. I had problems with treeview methods, but when I run them using invoke method everything is ok. But I still have one problem. When I load the form for the first time, everything works fine. But, when I then close the form (me.dispose, me.close), and load it once again, when Filesystemwathcer start the procedure i have an exception "invoke or begininvoke cannot be called on a control until the window handle has been created" trying to run a treeview.invoke method?
I'm in the Progress of changing a big Application from Singlethread logic to Multithread logic. I'm currently move Dataloading Logic into a sperate thread, and work with callbacks after they are finished. I have Synclocks in place in order to ensure threadsafty. But sonetimes the Synclocks wait even if there is no other thread with the same synclock active. Is there any way to find out what witch thread they are waiting for, and why? BTW, I have FW45 installed, may that be the reason, since it'S a inplace upgrade for FW40?
It is a requirement that all .net Controls are created on the main thread, at least this is necessary if the intent is to integrate the control in with the interface which is usually the case. Additionally to modify properties on the control one must invoke the method from the control's thread using its own invoke method.
Is there a way to look at a control and identify its owning thread directly?
Additionally or conversely, is it possible to detect whether the current thread is the "Main thread"? Is there anything special about the thread that Visual Studio identifies as the main thread that can be seen at runtime, or is it simply that this is the first thread that VS executes to initialise debugging?
In one application, I need use 4 simultaneous threads.When the threads finished, I need to update the text of a TextBox.So, I create 4 Textbox, and I wanna the threads change the text to FINISHED.Each thread change one distinct TB.I use this "example"
Dim Terminados As Integer = 0 Private Sub frmEnviarMensagem_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = True Timer1.Start()
[code]....
The problem is, I have an error in the red lines.The error is: INVALIDOPERATIONEXCEPTION "Cross-Thread operation not valid: Control tbPlaca1 Accessed from a thread other than the thread it was created on."I don't use cross threading. Each TB only was accessed for the correspondent thread, and for the "main program".
"Cross-thread operation not valid: Control 'Panel1' accessed from a thread other than the thread it was created on." The reason I am getting this error is because I am opening up a new form and then calling these three things:
Panel1.Show() Label1.Show() Label2.Show()
why I get this error message because it doesn't occur normally if I open Form2 after closing Form1, it only occurs when I open Form2 after closing Form4.
When my client try to connect to server I'm getting this error : Cross-thread operation not valid: Control 'l_users' accessed from a thread other than the thread it was created on.
Private Sub _socketManager_onConnectionAccept(ByVal SocketID As String) Handles _socketManager.onConnectionAccept l_Users.Items.Add(SocketID) End Sub
Would anyone be able to help me here please. I'm fairly new to VB.net and threading so im just trying to figure out what is happening.When I debug this I am getting the error thread operation not valid: Control 'ProgressBar1' accessed from a thread other than the thread it was created on.
I'm a little lost as to why the error is occuring or how to fix it. I've had to put the progress bar in a separate thread otherwise the GUI crashes
My understanding is that thread.join will suspend the execution of code on the calling thread until the spawned thread finishes or is aborted...
With that in mind, I tried this:
For i = 1 to 50 threads = New Thread(AddressOf test) threads.IsBackground = True threads.SetApartmentState(ApartmentState.STA)
[CODE]...
However, the rest of the code runs when the loop finishes, not waiting for all the spawned threads to finish. Since the rest of the code needs the threads to finish (otherwise the rest will error).
I have written an application that loads a form - frmCad as well as AutoCad. It does this via a class which detects when AutoCad quits.
Friend Class CadApp Private WithEvents AppObject As AcadApplication... Private Sub AppObject_BeginQuit(ByRef Cancel As Boolean) Handles AppObject.BeginQuit RaiseEvent Quit() End SubEnd Class
My main class loads frmCad as well as CadApp.
Public Class Cad Private WithEvents frmCad As CadForm Private WithEvents app As CadApp... Public Sub ShowForm() If frmCad Is Nothing Then frmCad = New CadForm frmCad.Visible = True End Sub... Private Sub app_Quit() Handles app.Quit frmCad.Dispose() frmCad = Nothing .... End Sub
When I debug the program, it stops at frmCad.Dispose()The program continues to execute, but all the code after it fails to work.Looking more carefully I get an error message which contains:-Cross-thread operation not valid: Control 'Autocad' accessed from a thread other than the thread it was created on.
My error:Cross-thread operation not valid: Control 'label2' accessed from a thread other than the thread it was created on. I want to be able to give my Public RunBot() sub access to edit Labels, buttons, etc without an error.
My problem is Cross-thread operation not valid: Control 'statusHO' accessed from a thread other than the thread it was created on.
System.InvalidOperationException was unhandled Message="Cross-thread operation not valid: Control 'statusHO' accessed from a thread other than the thread it was created on." Source="System.Windows.Forms" StackTrace:
[Code]...
i used it and it works fine then. but as it is mentioned its not a good practice to use it. So what should i do? is it ok if i use this as i am not able to use correct practice. Mine application is not for enterprise purpose. its just my class project, and it works fine even if i put application working in background. System works ok. I dont know how to correct this error.As i dont have that much knowlege of threads.
So please guide me how to fix this in correct way otherwise i am force to go for bad programming practice Please refer to Windows Mobile Developer Center > Smart Device Development Forums > Windows Mobile Development > Appendtext not working for all my code details