|
The code below is all in one class:
<br />
private string test = "nothing";<br />
<br />
public void deviceArrival(DeviceMonitorEvent dme)<br />
{<br />
this.test = "changed";<br />
}<br />
The event handler (method) is only run in the background thread, the instance variable is only used in my main thread.
When the event is fired, I want to change the value of 'test' in the main thread to "changed".
Currently it stays as "nothing" because I don't know how to cross-thread the two.
Any ideas?
Cheers,
modified on Wednesday, May 21, 2008 1:00 AM
|
|
|
|
|
Without seeing any of your code, just how are we supposed to help you?
You have to use a delegate to call a method that does the UI work, and when the event is triggered, you call this.Invoke() or one of its overloads. As to what the compiler is complaining about, I have no idea.
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
Vikram A Punathambekar wrote: Without seeing any of your code, just how are we supposed to help you?
The code below is all in one class:
<br />
<br />
private string test = "nothing";<br />
<br />
public void deviceArrival(DeviceMonitorEvent dme)<br />
{<br />
this.test = "changed";<br />
}<br />
<br />
The event handler (method) is only run in the background thread, the instance variable is only used in my main thread.
When the event is fired, I want to change the value of 'test' in the main thread to "changed".
Currently it stays as "nothing" because I don't know how to cross-thread the two.
Cheers,
|
|
|
|
|
I thought you were updating a UI control? If you're just updating a class member, you don't need delegates. Perhaps the event is not being fired? I can't think of any other reason your snippet does not work. Did you place a breakpoint and see if it stops there?
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
Vikram A Punathambekar wrote: I thought you were updating a UI control?
Yea i am, but if i can get the above code working that will solve my program.
Ive edited the question to be clearer though.
Cheers,
|
|
|
|
|
May be you will have to declare your variable as volatile for allowing it to be updatable by multiple threads.
Thanks
Laddie
Kindly rate if the answer was helpful
|
|
|
|
|
Yea I tryed that but it still dosen't seem to work:
<br />
<br />
private volatile string test = "nothing"<br />
<br />
public void deviceArrival(DeviceMonitorEvent dme)<br />
{<br />
this.test = "fgfg";<br />
}<br />
<br />
The result still comes out with "nothing" when I access it in my main thread.
The event is definately firing, ive tested it with a messagebox.
Cheers,
|
|
|
|
|
1) Create a function in the form class to update your presentation.
2) Now create and initialize the MethordInvoker with the above function
with in the thread.
MethodInvoker mi = new MethodInvoker(UpdateUI);
3) Now you can get your function in the Presentation to uodate the UI by calling mi.Invoke();
Hope this helps.
Thanks
Laddie
Kindly rate if the answer was helpful
|
|
|
|
|
There really isn't a simple answer.
The problem is that the background thread may well be updating it, but that doesn't necessarily mean that the main thread is actually going to read it. You have to synchronize the execution of the two threads for the update to be seen by the other thread.
If the 'main' thread is running UI, as the others have said, one approach is to send a message to the main thread using Control.Invoke . It's often better to send the data that's changed in a parameter of the method that's invoked.
Otherwise the tidiest approach generally is to use locks, for example, the Monitor class, whenever the value is read from or written to (you must do both, and you must lock the same object in all situations). However, you now have to be aware of the possibility of deadlock - any time more than one lock is acquired at the same time, you can get into a situation where one thread owns lock A and needs lock B, while another owns lock B and needs lock A (bigger situations where multiple threads all own some locks and need others can also exist, this is just the smallest simplest example). Each thread ends up waiting for the other, neither can proceed, and generally the program becomes unresponsive. The only true way to avoid a deadlock is to ensure that locks are always acquired in the same order, where multiple locks are acquired by the same thread. This generally leads to fewer, coarse-grained locks. However, this can cause these locks to become 'hot-spots', where threads end up waiting for one another to release commonly-used locks. In the worst case you can get a 'lock convoy' where the threads never actually run in parallel, instead they run in turn as each acquires a lock and all the others wait on that lock.
Lock-free programming is even harder.
I would generally be happy not to write multithreaded programs or if I do, to rely solely on messaging. The more highly concurrent you get, the more complicated the system becomes and the higher chance of a race condition (as you've seen) or a deadlock.
DoEvents: Generating unexpected recursion since 1991
|
|
|
|
|
Hi Mike,
Thanks for your help, ive resolved the problem now.
Cheers,
|
|
|
|
|
I have an application that I'm converting to C# and have run into a problem. If I overlooked the discussion of this elsewhere, I apologize in advance. Here's the situation:
I have a list box with various items in it. When I click on one, I want it to select the item and highlight the equivalent info on another control - that works perfectly. When I doubleclick, I want it to open a dialog allowing the item to be edited, displayed in detail or something similar.
Unfortunately, even though both events are active and coded, the single click event always fires, no matter how fast one doubleclicks. In order to get the double click to work, I have to click 3 times and the single click event always fires first.
I know one option would be to change the UI, but this is a mature (but non.NET) application and users want the same click vs. double click performance, so changing the behavior is a last resort and not really a good option.
Is there something I'm doing wrong? Is there a workaround?
BTW, the equivalent code works perfectly in the old app, which was written in Delphi.
Any suggestions or insights would be very much appreciated!
The PetroNerd
Walt Fair, Jr.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
I remember reading a while back that a double click action should always be an 'add on' to a single click. Eg: In Explorer, single click selects a folder/file; double click selects it and then opens it.
I suppose you could spin off a thread in your single click handler that waits to see if a double click event is fired, and if not, does its work. I am almost certain that would turn out to be very ugly. Long story short - if your double click action differs significantly, it's better off as a right click option.
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
Vikram A Punathambekar wrote: I remember reading a while back that a double click action should always be an 'add on' to a single click. Eg: In Explorer, single click selects a folder/file; double click selects it and then opens it.
Actually the program pretty much does that. The single click selects the item on the list and changes it's color on the adjacent map, show that it is selected. The double click effectively displays details of the selected item. That's exactly what the MS documentations say should be done.
Actually I don't mind if the Click event fires. The problem is having to more than double click to get the DoubleClick event to fire.
The PetroNerd
Walt Fair, Jr.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
Assalam-0-Alaikum
Are you willing to do it on ClientSide or ServerSide?
Regards.
Atif Ali Bhatti.
|
|
|
|
|
Alaikum Assalam.
He is talking about a Winforms app.
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
|
Thanks! I'll take a look. This works fine in other systems, so there has to be a solution.
The PetroNerd
Walt Fair, Jr.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
Well, I looked at the links you provided and realized I had already checked them before posting my original question here. However, I also have done some more troubleshooting - and still have no idea what I'm doing wrong.
I now removed the MouseClick event totally and replaced it's behavior with the SelectionChanged event. I still don't get the MouseDoubleClick event firing until the 3rd mouse click. I even removed the SelectionChanged event - same thing - it takes 3 clicks to get the MouseDoubleClick event.
I guess I still have some more playing around to do. My random thought is that maybe the MouseMove event or something else is interfering, but I wouldn't have expected that at all. Is it possible that the list control doesn't have focus and it takes an extra click to get focus, then start with the double click? As you can probably tell, I'm grasping now.
Thanks for the links and at least it got me thinking along a different line.
The PetroNerd
Walt Fair, Jr.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
Assalam-0-Alaikum,
Well why the MouseDoubleClick event is taking 3 clicks to fire is due to the fact that you have to rollback the activity performed during the first click.. this is very important point to keep in mind. after rolling back the first click event activities, you are supposed to handle the double click event.
Hope you get my point.
Regards.
Atif Ali Bhatti.
|
|
|
|
|
Maybe I'm just dense, but I don't get the point.
As I mentioned in another post in this thread, I've disabled the MouseClick event. It doesn't have a delegate, it doesn't do anything, the event handler has been deleted. There doesn't seem to be anything to roll back.
The only mouse event I have active with a handler is MouseDoubleClick.
And it still takes 3 mouse clicks to get it to fire.
Obviously I'm missing something or .....
The PetroNerd
Walt Fair, Jr.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
Actually it's a desktop app, no client or server involved.
The PetroNerd
Walt Fair, Jr.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
I have an exe file built in .Net 1.1
I use the System.Web.Mail class to send an email...
when i run the executable locally say by double clicking the file the program runs fine and i receive the email.
However the purpose of the exe is to be run from a website that i have developed by using ProcessStartInfo. Under this scenario i get the error
'Could not create CDO.Message object'
Now i did all the correct checks as having permission to cdosys.dll and making sure the user ASPNET and NETWORK SERVICE have full permissions to the exe. As stated before the code runs perfect when run by double clicking the exe but not when run by the web app im running on my localhost.
|
|
|
|
|
I found a Swedish article with someone running into a similar problem. I don't know the exact wording of the message - he only wrote something about the code "not being able to access the CDO.Message object" (in Swedish), which may or may not boil down to the same message.
In any case - he solved the problem by recursively looking at the InnerException of the exception thrown and so on. Turned out to be a really simple mistake (missing e-mail address), but the original exception was a bit misleading.
Try do something like this:
try
{
}
catch (Exception ex)
{
Response.Write(ex.ToString());
Response.End();
}
(note: written as if it were a web app, which your exe probably isn't. Response.Write won't do you any good then, of course - use whatever's appropriate)
Later,
--
Peter
|
|
|
|
|
using System;
using System.Collections.Generic;
using System.Text;
namespace WindowsApplication1
{
class Pupil
{
public int ID;
}
static void Main (string[] args)
{
Pupil Patrick = new Pupil();
Pupil Cathy = new pupli();
.....................................................................
using System;
using System.Collections.Generic;
using System.Text;
namespace WindowsApplication1
{
class Homework
{
public int numberofWork;
public string keyword;
}
static void Main (string[] args)
{
Homework Patr = new Pupil();
Homework Cath = new pupli();
.......................................................................
Am getting error message Expected class delegate,enum,interface or struct.
Any guidance on how I may rectify this?
|
|
|
|
|
Looks like you're missing closing curly braces.
Also you're headed for casting problems unless you fix the last 2 lines in your example.
Scott P
“It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.”
-Edsger Dijkstra
|
|
|
|