Wait/suspend Execution For A Certain Amout Of Time Without Hanging The Main UI Thread?
Dec 31, 2010Is it possible to wait/suspend execution for a certain amout of time without hanging the main UI thread?
View 7 RepliesIs it possible to wait/suspend execution for a certain amout of time without hanging the main UI thread?
View 7 RepliesMy 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 feel like the answers I seek are rather obvious so I feel silly for having to ask, but I just can't seem to figure this out (I'm new to threads, and am really only comfortable using them in Java at the moment). I have an Excel Addin application created with VB.NET, and I've noticed that occasionally while it's running some code (it's no one specific block of code) the program execution will just stop. This is especially problematic when I've set ScreenUpdating to False for Excel because the users then have to completely close out of Excel to get ScreenUpdating to true.
[Code]...
I have a per-call WCF service that serves a number of clients. I'm looking to speed up the services by running some background processes so they don't block or slow down the main function of the services.
One example is that the main function needs to return a set of data, while the background thread needs to record some statistics based on the parameter(s).
Code:
Public Function GetAccountDetails(id As Integer) As AccountDetails
Dim retVal As New AccountDetails
Dim a As New Accounts
[Code]....
If I use this background thread to record the statistic it doesn't block the main thread from returning the data to the client.
It's been working well in test scenarios, but my question is, are there any dangers with leaving this thread to execute without Joining it before returning the data to the client? Could there potentially be any loss of statistic data? Could there be potential memory problems on the server side?
I have a a main thread and another background thread that does some work (see below).I want to do something within my worker thread and then wait until some other event happens in the main thread before continuing. How do I do this? I thought I could use ManualResetEvent but I can't get it to work properly. I'm a bit confused about the Set, Reset, WaitOne methods and where exactly I should call them from.When the worker thread is suspended it shouldn't affect the main thread.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
[code]....
I am trying to use a separate thread to handle specific events in VB.Net. The idea being that I do not want the main application to be held up if a particular event handler takes awhile to finish. How do I get my main thread loop to suspend the thread while allowing it to handle events when they occur?When I create a Windows Forms application, there is a UI thread that handles the UI events. I do not imagine that this thread is continuously polling some variable to see if someone has pressed a button. I imagine the thread is suspended until the OS tells it there is something to do. I was trying to figure out how to ensure that my event handlers were not being executed by the UI thread. From what I have read, I can do this by raising the events from a different thread. But what does that thread do while it is waiting for other events, just exit?
I wanted to know how to create a thread that works like the UI thread, only it processes the events I want it to process. I am not sure how events work in .Net. I understand that event handlers are run on the thread that raises the event. I believe that .Net allocates threads from some thread pool to process events such as timer events. I am not clear on how it works, though, and what those threads are doing when they are not handling events.
Looking for a solution to pause and resume a thread. When I use suspend and resume it says its no longer supported. Here is the code. I'm just trying to get it to cycle between two "do until" events.
[Code]...
I have a really simple form with a button that fires a Sub I created which gathers data from ActiveDirectory and adds it to an Excel Sheet. The problem is, when I click this button the whole form hangs. So I figured the operation that gathers the data and adding it to the Excel sheet should be run in it's own thread, so that the form won't hang. Possibly it would be great to add a progressbar as well. The progressbar however is located at the Main userform that starts up once the projects is run.
I've got one MainForm.vb and one CodeFile.vb. I want most of the code in the CodeFile.vb so it's tidier.
MainForm.vb
Imports User_edit.CodeFile
Imports System.ComponentModel
Public Class MainForm
Private Sub btnImportData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportData.Click
[Code] .....
Notice the ExportFromAD Sub I've got in the CodeFile.vb. This is what is actually doing the work. In the For each loop that adds data to the Excel is where I've put the MainForm.MyBackgroundWorker.ReportProgress(i * 10). Problem is, it doesn't actually update the label on the form. Which I find pretty weird because the form isn't really hanging or anything. Is it trying to access a different thread or something? Meaning, the form is run on it's own thread which can't be accessed from my second thread?
I have code that just runs and runs, and I'd like it to stop and take a rest. I want execution to wait for a mouse event and then continue. I can't just put the code to be executed after the event directly into the Click handler, because many different sections of code need to stop and wait for the event. I'd like the code to stop, wait for the Click event, then continue. I tried the test code below, but it pretty much hangs the program during the Do Until loop; I can't even press Button2. [Code]
View 6 RepliesI have created a windows service in C# .net and now I want it to alert me if its going to shutdown. For this I make use of Dispose/Unload events but now I want if the services are stopping due to system shutdown process it will alert me.
View 1 RepliesI'm creating a Client Server application which involves theServer running some scripts in clients and getting back results in an automated way. In Server, other than Main thread, i have 2 worker threads, a) one monitoring response from clients and b) the other scheduling next available job to respective client which executes that job. The issue here is ,I want these worker threads to write the status of their work in the UI(which comes under Main Thread). Also i need to write things in worker thread in a Data table and Rich Text Box in Main thread. But, I can't do so, since it has been blocked to access one thread's function or property directly from others. Is there any work around to do this?
View 8 RepliesPreface: I know this is an unusual/improper way to do this. I can do this with a "real" ShowDialog(), background worker/thread, and so on. I am trying to do specifically what I describe here, even if it is ugly. If this is impossible for X reason, I have created a fancy progress dialog for some of our long running operations. I need to have this dialog shown on a new thread while having processing continue on the calling (UI in most cases) thread.
[Code]...
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.
Imports System.Threading
Module VMain
Public gbSuspend As Boolean
[CODE]...
I'm working with BackgroundWorker, I want the BackgroundWorker do the retrieval process of data from database while the user can still do another task on the form. The problem is, after retrieving the data, I can't seem to access the ListView in my Form from the DoWork event of BackgroundWorker, I will populate that ListView using the data I've retrieved.
Consider this example, this is how I'm doing it:
Public Class Test
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
[Code].....
could someone tell me how to fire an event in main thread from another thread as well as fire and forget without use a new thread?
View 9 RepliesI'm reading data from a serial port, but the DataReceived event of SerialPort is handled on it's own thread. I want to handle this on the main thread, but simply declaring an event and raising it still results in it being processed on the SerialPort thread. I'm assuming I need to declare a delegate I can call, but I don't see how that would work.
For example, I want to call Sub HandleDataReceived() on the main thread from the DataReceived thread, having HandleDataReceived() run on the main thread. How would I do this?
According to the answers to another question, the VB user interface cannot be updated if the thread that created it is busy: hence why big computational jobs usually have to go in a background task.Here's what's mystifying then. I have the following code. It's called over in-process COM, like this
client calls showform()
client does loads of work, freezing up its own UI in the process
client finishes work, returns to updating its own UI
At step 2, the VB form is there but frozen - you can't interact with it. At step 3, the VB form becomes usable. But why is this? Surely the thread of execution has returned to the client? If the client is somehow handling events for the form, by what magic did it know what events to handle and where to send them?
[Code]...
I am working on a game launcher, and I need to display a "Splash screen" until the main game has started. For this, I need to know whether or not the Process has a Main window that is fully loaded and displayed.Now I noticed the main window handle is 0 when there is none, so I tried to use that:[code]But the handle never becomes nonzero. I tried to use the title but to no avail.I do not want to go into "Thread.wait()" since then the splash would remain even if the game is already launched.
View 4 RepliesI'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?
View 19 RepliesI have a vb.net application that uses threads to asynchronously process some tasks in a "Scheduled Task" (console application).We are limiting this app to run 10 threads at once, like so:
(pseudo-code)
- create a generic list of 10 threads
- spawn off the threadproc for each one
- do a thread.join statement for each thread to wait for the longest running one to complete.
What i am finding is that if the code called by the threadproc contains any "Debug.Writeline" or "Trace.Traceinformation" statements, the thread hangs. I can see the thread in the Debug - Windows - Threads window, and switch to it, but it highlights the debug.writeline statement and never gets past it. is there something special about the Debug or Trace statements that make them non-thread-safe? Any idea why this would hang things up? If I leave the debug statement in, the thread never completes. If I take the debug statement out, the thread completes in less than 5 seconds.
Is there a synchronous wait function that won't tie up the UI-thread in .NET WPF? Something like:
Sub OnClick(sender As Object, e As MouseEventArgs) Handles button1.Click
Wait(2000)
'Ui still processes other events here
MessageBox.Show("Is has been 2 seconds since you clicked the button!")
End Sub
I have been reading the async design patterns on MSDN and the general idea makes sense to me but in practice it is proving to be more difficult. I am working on a project utilizing VMWARE VIX.
HTML Code: [url]. Each function such as connecting to a host server, retrieving properties, etc. can be executed in two different ways.
Connecting to a host using a blocking Wait:
Code:
Dim m_lib As New VixLib
Dim m_hostJob As VixCOM.IJob
[CODE]...
Code:
Dim m_lib As New VixLib
Dim m_hostJob As VixCOM.IJob
dim m_callback as VixCOM.ICallback
[CODE]...
The problem with the VIX SDK is that sometimes the functions never return, hanging the application. dblock.
HTML Code:[URL] came up with a library that specifies a timeout value. When the timeout runs out the method aborts and returns regardless whether it finished or not.
The callback method is an active wait where the code continues to execute. What I want to implement is a blocking wait with a timeout. The ICallback interface has one sub OnVixEvent(IJob,Integer,IVixHandle). This method is fired at least twice, first when some progress is posted and second when it is complete. The first call to this method can be one second after registering the callback or 30 seconds, so I can not rely on this method to block the main thread. how to create some kind of async result class that would block the main thread from executing until either a timer runs out or the OnVixEvent method returns an Operation Complete signal that also implements ICallback.
I have a series of methods being called for my networking code. An event gets fired from the networking thread. Inside this event, which I've hooked into from a singleton class, I route messages to form level methods which they register on form load to handle certain messages they care about. Inside of these form message hooks I need to close the current form (which I was able to do) but also show a different one (which is giving me the trouble).
[Code]...
I have an application that takes a long time processing information on a datagridview. So, I was thinking on a "please wait" dialog, with a progress bar in it.
Problem:
- I want it to behave like a ".showDialog" that prevents users to access the main form.
- But it shouldn't stop the code execution.
I tried to create a new thread to show the dialog, but this way it will not "lock" the main form... I want it to be always on top and focused, while open.
Basically after I queue all works, I want to wait until all I queued has been done. How do I do so?[code]I notice there is no way to know how many threads are still running in the threadpool.
View 2 RepliesThere is a problem with standard System.Timers.Timer behaviour. The timer raise Elapsed event with some interval. But when time of execution inside Elapsed event handler exceed timer interval then thread pool begin queuing event handling. This is a problem in my case. This is because with my Elapsed event handler I fetch some data from database and doing something with it and finally save results back to database. But data handling should be provided only once. So, is there a way to prevent from queuing elapse events for System.Timers.Timer.
As illustration for this issue you can consider next test program:
[code]...
2) Second way is about SynchronizingObject, but it is a valuable only for Windows form application or required additional development of code for implementing object that would be implements ISynchronizeInvoke interface. More about this way you can find here
I have a DataGridView control in my Windows Forms Application. I am adding rows to the grid using a background thread. I change the form's cursor to Waitcursor when the process starts and back to Default when it ends. This works well for the form, but not for the grid. When the form's cursor is changed back to default, the grid's cursor does not change, although the cursor over the rest of the form does.
I am updating the grid from a background thread? (The cursor is being changed from the UI thread directly). The background process raises an event, the handler checks the InvokeRequired property of the grid and decides if it needs to "Invoke" the method again from the main thread. So, in effect the actual UI update happens from the appropriate thread. I am not sure if this means that I am "using a background thread" or not.
I have a problem with releasing locks on a thread. [Code] If Me.IsStarted Then 'checks if my service is started and ready of service requests 'code here to enqueue my job and objRxResult with the service so it can populate it with the result before Pulsing back 'the service has its own thread that it dequeues jobs off of and processes them on it own time 'during this key enqueue phase we block attempts to stop the service, thus the _objIsStarted lock [Code].
View 4 RepliesI want to be able to run a thread and then at a certain point pause it and wait for the user to enter some text into a text box and then when they press submit i want the program to run again from where it left off.
View 10 RepliesI have an application that displays real time data. Queries are made to a MySQL database on another PC over the internet every 10 seconds to gather the most recent data.Originally I did the query within a BackgroundWorker so that the GUI is still responsive while the query is answered. However, I found that I need a timeout on the database query (as sometimes it hangs without generating an error) and couldn't do this within the background worker.
So now I'm trying to do it with threads. I have managed to run a thread to get the data.I need to understand how to run a task on the main thread when the GetDataThread is complete. If I do this using Events as shown below then Sub GetDataComplete is running as part of the GetDataThread not the Main Thread. I want to run a sub like backgroundWorker1_RunWorkerCompleted (this seems to run on the main thread).
My Main thread is called MainThread
VB
Imports System.Threading
Imports System.ComponentModel
[code]....
How can I run a task on the main thread when the GetDataThread is complete.