|
Thanks for the bug fix. I look forward to the new and improved version.
|
|
|
|
|
I finally had a chance to look at your code, I was on vacation.
I really like it but I want to use it a little differently
than your example.
I don't want to expose the eventQueue directly to plugins.
I don't want them to have to have that code in order to
compile a plugin.
Maybe you can help me out. I want my system object to be
responsible for creating events and subscribing plugins
to them.
If you remember my setup Plugins have an
bool OnMessage( ISystem sys, IMessage msg );
The plugin can create a message using:
IMessage m = sys.NewMessage( "music.play" );
m.Send();
My problem is that the message object gets created over and over again
and therefore not persistent. The Send method in the Message class needs
to be able to create and send the events.
How can I accomplish this?
Thanks
-- modified at 14:44 Tuesday 4th July, 2006
|
|
|
|
|
Here[^] is the updated version. I made a few changes, cleaned up the code, and added comments. I think this is a fairly stable version.
|
|
|
|
|
Thanks you are most kind.
|
|
|
|
|
For some reason, I keep getting an error when trying to reply to your latest message, so I'm trying here instead.
The System object could have a hash table where it keeps its messages. When a message is created, the name of the message is stored as a key in the hash table and the message object is stored as its value. Next time someone calls the NewMessage method asking for the same message, instead of creating a new message, the original message is retrieved from the hash table. So only one message of each type is created.
When a message object is created, it can be passed the EventQueue along with the name of the message. When its Send method is called, the Message sends the message using the EventQueue . So the EventQueue is hidden inside the Message class. The plugins don't have to know anything about it.
|
|
|
|
|
This part I understand
Leslie Sanford wrote: The System object could have a hash table where it keeps its messages. When a message is created, the name of the message is stored as a key in the hash table and the message object is stored as its value. Next time someone calls the NewMessage method asking for the same message, instead of creating a new message, the original message is retrieved from the hash table. So only one message of each type is created.
This part I don't understand
Leslie Sanford wrote: When a message object is created, it can be passed the EventQueue along with the name of the message. When its Send method is called, the Message sends the message using the EventQueue. So the EventQueue is hidden inside the Message class. The plugins don't have to know anything about it.
class System
{
Hashtable hashList = new Hashtable();
EventQueue eventQueue = new EventQueue();
public Message NewMessage( string sub )
{
Message m = null;
if( !hashList.ContainsKey( sub ) )
{
m = new Message( "music.play" );
hashList.Add( sub, m );
eventQueue.CreateEvent( sub );
}
else
{
m = (Message)hashList[sub];
}
return m;
}
}
class Message
{
string subject;
string data;
public Message(string s)
{
this.subject = s;
}
public void Send()
{
string sub = this.subject;
string datium = this.data;
}
}
|
|
|
|
|
This is what I was getting at:
public class Message
{
string subject;
EventQueue queue;
string data = string.Empty;
public Message(string s, EventQueue queue)
{
this.subject = s;
this.queue = queue;
}
public Send()
{
queue.Send(this.subject, this, data);
}
}
|
|
|
|
|
I thought that the eventQueue was part of the system object.
Using your example the eventQueue will get disposed of each time a
message is created and thereby losing any subscriptions.
Also your still passing in the eventQueue which means the plugin
will need that code to compile.
Am I misunderstanding still?
-- modified at 17:10 Tuesday 4th July, 2006
|
|
|
|
|
smesser wrote: I thought that the eventQueue was part of the system object.
The System object owns an EventQueue object. It's the System's job to dispose of it. It's simply passing the EventQueue object along to the Message objects so that they can use it to send messages. Make sense?
|
|
|
|
|
It makes perfect sense but it violates the coupling I mentioned several responses back when we were talking about hiding the eventqueue completely from the plugin.
My intention is that the System object creates the eventqueue and any new messages and sends them to all plugins which have subscribed.
The plugin would send reponses that the system object would turn into events and add them
to the queue or send them.
Thats what I thought we were trying to accomplish a few posts back.
|
|
|
|
|
Hmm, I may not have a clear understanding of the architecture you're trying to implement.
As far as coupling goes, if you have an IMessage interface that all message classes implement, then all the plugins have to know about is the interface. The concrete implementation will be hidden from them, and thus the EventQueue .
|
|
|
|
|
Yes, but then that brings me back to one of my orginal questions.
If the System object creates and disposes of the event queue.
Then where does the event queue inside of the message class fit it?
Each instance of message would have it's own eventqueue that would get
disposed of when the message was disposed of taking with it any subscriptions
that may have been made to it.
Simple overview:
1. System object creates messages and manages the global eventqueue
2. System object creates and sends events from plugins via the Message send method.
This way there is one global event queue.
3. Plugin has no concept of event queue nor cares about it.
Hope this makes sense.
|
|
|
|
|
smesser wrote: Each instance of message would have it's own eventqueue that would get
disposed of when the message was disposed of taking with it any subscriptions
that may have been made to it.
But the messages wouldn't dispose of the EventQueue given to them. It's all in how you implement the message class's Dispose method. Whatever the message does when it is disposed of, it knows not to dispose of the EventQueue because it doesn't belong to it.
smesser wrote: Simple overview:
1. System object creates messages and manages the global eventqueue
2. System object creates and sends events from plugins via the Message send method.
This way there is one global event queue.
3. Plugin has no concept of event queue nor cares about it.
I think it's number 2 that's giving me trouble. Let's run through a scenario to see if I understand:
1. The System sends a message to a plugin via the OnMessage method.
2. The plugin does something with the message.
3. The plugin wants to send a message telling the System and any other plugins listening that something has happened.
4. The plugin asks the System for a message object representing a specific message, e.g. "PlayCompleted".
5. The plugin gets the message back from the System and sends it calling the message's Send method.
Is this close?
|
|
|
|
|
Leslie Sanford wrote: I think it's number 2 that's giving me trouble. Let's run through a scenario to see if I understand:
1. The System sends a message to a plugin via the OnMessage method.
2. The plugin does something with the message.
3. The plugin wants to send a message telling the System and any other plugins listening that something has happened.
4. The plugin asks the System for a message object representing a specific message, e.g. "PlayCompleted".
5. The plugin gets the message back from the System and sends it calling the message's Send method.
Is this close?
This is very close
1, 2, and 3 spot on.
4. The plugin would subscribe to messages that it is interested in. The plugin never explicitly
asks the system for a message. It could by timer send messages via a stored reference to the
system object or via a subscribed event the plugin could get it's OnMessage function called
thus exposing the System object and the current message that is being sent. The plugin could
either do the prescribed action and/or generate it's own event/message.
I am trying to have the System object bare the burdon of the event queue. The plugins only
exposure to the system is via it's OnMessage function which only exposed the system object which
would do the actual message creation and then the message retrieved fromt the system object
could then be sent.
5. Close, the plugin would get a the message from the System/EventQueue and either ignore it,
respond to it by using the system object to create a new message and then sending that new
message. The plugin's OnMessage function would return true if the message was consumed.
You wouldn't resend a message sent via the OnMessage function but create a new one if a
response it warranted.
|
|
|
|
|
smesser wrote: 5. Close, the plugin would get a the message from the System/EventQueue and either ignore it,
respond to it by using the system object to create a new message and then sending that new
message. The plugin's OnMessage function would return true if the message was consumed.
You wouldn't resend a message sent via the OnMessage function but create a new one if a
response it warranted.
So you could have something like this in a plugin?
public bool OnMessage(ISystem system, IMessage message)
{
if(message...)
{
}
IMessage msg = system.NewMessage("Completed");
msg.Send();
return true;
}
One thing you may want to consider is to use the System class as a wrapper around the EventQueue class. So instead of using message objects, a plugin would call a method on the system object itself. So...
public bool OnMessage(ISystem system, IMessage message)
{
if(message...)
{
}
system.Send("Completed", this, someData);
return true;
}
One thing that I think needs clearing up is the event handlers in the plugins. If a plugin sends an event to the other plugins, would you require those events to be handled in the OnMessage method, or would you have other methods for handling events from other plugins?
I'm trying to find out if a plugin distinquishes between events sent from the System and from other plugins.
|
|
|
|
|
Leslie Sanford wrote: One thing you may want to consider is to use the System class as a wrapper around the EventQueue class. So instead of using message objects, a plugin would call a method on the system object itself. So...
The only problem for me with this approach is that my message object inherits from a Data item and also can cantain a list of this data items. It is very flexible and can be used to send lists of any type of data.
Leslie Sanford wrote: One thing that I think needs clearing up is the event handlers in the plugins. If a plugin sends an event to the other plugins, would you require those events to be handled in the OnMessage method, or would you have other methods for handling events from other plugins?
I'm trying to find out if a plugin distinquishes between events sent from the System and from other plugins.
Yes, all plugins would receive events via the OnMessage function whether it be from the system or
another plugin. I haven't mentioned it but there is a separate send function for sending a message to another plugin.
bool SendTo( plugin handle )
Something to that effect, I haven't worked out the detail yet.
So, a message is a message regardless of who send it. It could be from the system or any number
of plugins. If you are subscribed to it you will get your OnMessage function called.
|
|
|
|
|
smesser wrote: The only problem for me with this approach is that my message object inherits from a Data item and also can cantain a list of this data items. It is very flexible and can be used to send lists of any type of data.
Ok. Well, you could keep the message classes around but still move the event sending to the System class:
public bool OnMessage(ISystem system, IMessage message)
{
if(message...)
{
}
system.Send("Completed", this, new SomeMessage());
return true;
}
|
|
|
|
|
Thanks for all the input. I need to put some serious thought into all this with a fresh mind.
|
|
|
|
|
Hi
I added an axMaskedEdit control to my project, i had no problem until i developed exe file, Now I can't open all forms that i used this control in them when i run the program. Microsoft says register that, but why? how ?
Thanks
-- modified at 16:03 Saturday 24th June, 2006
|
|
|
|
|
Please Help Me
I have an application in C#, and the objective is capture a image using grabberCapture (DSHOWNET),apply some filters,rotations,etc and use sqlcomands(ACCESS Database). I also have a timer that make many captures.
The problem is after capture three or four images, give this error:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.drawing.dll
Additional information: The object is currently in use elsewhere.
PS: Sorry my Writen English!! but Help ME
MD
|
|
|
|
|
Hi!
Could it be that the image is being accessed from another thread as well?
You could try securing the painting of the image (or whatever you do with it) with a lock statement.
Regards,
mav
--
Black holes are the places where god divided by 0...
|
|
|
|
|
All,
I have written a COM Object in C++. I have a C# application that calls this COM object. One method in the COM object requires a variable to be modified to inform C# of an error. I create a variable of type Object in C Sharp and pass it by reference to the COM method. The com method receives this variable as a VARIANT*. In my C++ method I use variant_t to assign the integer value I want and assign it to the VARIANT* passed to the COM Method. This seems to work well in Debug mode but in Release I get the following error:
An unhandled exception of type 'System.NullReferenceException' occurred in CSharp Test Harness.exe
Additional information: Object reference not set to an instance of an object.
Can anyone help unscramble what I am doing wrong or offer a suggestion as to how to code this properly.
Kind regards
Dave
broken code is only broken if it's not yours
|
|
|
|
|
Check to see if the variant_t and the integer you are using are being initialized explicitly (in the COM component). Debug mode will initialize all locals for you, release won't... If you don't have access to the COM component source, then make sure you either initialize your return value object to something, or test to see if it is null before testing the value.
|
|
|
|
|
Hi all,
I'm writing a presentation application which uses a lot of graphics stuff. I'm very conscious of the memory management issues this throws up and would like to be able to test any object to find the current size in bytes so that I can do background loading/unloading of images. The sort of objects I need to query are: Image objects, ImageList objects, arrays.
In C++ I would call sizeOf() but I can't find an equivalent in .Net. I know a little bit about Marshal.sizeOf() but I want to be able to do this for Managed objects not Unmanaged stuff.
Surely this is a basic building block for application development. If it doesn't exist in C# then can someone explain to me why not!?
Thanks a lot guys,
Simon
|
|
|
|
|
You can use sizeof in C# too, but only on value types.
There is no method to get the size of objects, as that rarely makes any sense. If you for an example do like this:
string s = new string('x', 50000);<br />
string[] a = new string[10000];<br />
for (int i=0; i<10000; i++) a[i] = s;
Now you have an array of 10000 strings that each uses 100 kb. That adds up to about one gigabyte. But as all the strings reference the same memory area, it actually only uses about 140 kb.
If you want the memory size of an array you have to add the items yourself, and if there can be items referencing the same object, you have to decide how to handle that.
---
b { font-weight: normal; }
|
|
|
|