|
Cool Roger,
I understand and agree with all of your points, except the below one, "the server must have a message loop that's not deadlocked.", how message loop prevent server from deadlock?
regards,
George
|
|
|
|
|
George_George wrote: how message loop prevent server from deadlock?
Perhaps I didn't put that very clear...
What I meant was when the message loop has called a message handler, the thread doesn't pump messages unless the message handler provides functionality for that.
The message pump of the server normally pumps other messages than COM messages, which means that the STA thread may be busy when a call is made from a COM client.
Example:
Let's say you have a COM server in the main application thread and you've spawned a worker thread and marshalled an interface to the server into the worker thread.
You send a user defined message from the main thread to the worker thread with ::SendMessage() , which boils down to a call via the marshalled interface. The deadlock is now a reality since the STA where the server lives doesn't pump messages, it's waiting for the ::SendMessage() call to return.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Thanks Roger,
1.
I am confused about your sample. You have one process and two threads. Which thread is the STA owning thread which create the COM component? The main process or the worker process?
2.
Roger Stoltz wrote: marshalled an interface to the server into the worker thread.
You mean worker thread is COM client, and main thread is COM server (STA). Worker thread marshelled an interface to the COM server STA?
regards,
George
|
|
|
|
|
George_George wrote: You have one process and two threads.
Exactly.
George_George wrote: Which thread is the STA owning thread which create the COM component?
The main thread of the application is the STA thread where the server is created. This is an ordinary in-process server situation. Calls to the server from this thread in the client are simply function calls.
The server may be any server that can be created as an in-process server, i.e. by calling ::CoCreateInstance( ..., CLSCTX_INPROC_SERVER ) .
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Thanks Roger,
This is what you mentioned before about your sample. In my understanding, the main thread should be the STA thread which contains the COM component, the worker thread should be the thread as client to invoke/use the main thread.
Why do you think the main thread will send message to the worker thread? I think in order for the worker thread as COM client to invoke the main thread, it should send message to the main thread?
Please feel free to correct me if I am wrong.
--------------------
You send a user defined message from the main thread to the worker thread with ::SendMessage()
--------------------
regards,
George
|
|
|
|
|
George_George wrote: Why do you think the main thread will send message to the worker thread?
This was only an example of how the message queue of the STA thread can be blocked.
It has nothing to do with your code.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Thanks Roger,
I think I almost get your idea. Let me repeat to see whether my understanding is correct.
1. You create main thread (STA) and the worker thread (as COM client);
2. Worker thread will call the main thread, through marshelling;
3. When the main thread receives the method call in (2), it will call some method in worker thread through ::SendMessage, and will wait for reply from worker thread;
4. Since worker thread in (2) will be in wait status for main thread to return its call, the method call from main thread to the worker thread in step (3) will be blocked -- since the worker thread is in waiting status.
My understanding correct?
I think it is a situation when the main thread and the worker thread will wait for each other at the same time, it should be called deadlock??
regards,
George
|
|
|
|
|
Iain Clarke wrote: Wouldn't other apartments get their own copy of the com object, so it wouldn't block?
The following assumes the object being created lives in STAs:
- If another thread creates the object and the thread is a STA then a new object is created "in" that thread.
- If another thread creates the object and the thread is NOT in a STA then the object is created in an STA and the interface pointer is marshaled back to the creating thread.
Steve
|
|
|
|
|
Makes sense. I'm just glad I didn't pretend to be all expert! (For a change)
Iain.
Iain Clarke appears because CPallini still cares.
|
|
|
|
|
Cool and makes sense, Steve!
regards,
George
|
|
|
|
|
Hi all...
I'm trying to set the focus on my edit box with the help of following code
PostMessage(GetDlgItem(hPage1, IDC_EDIT1), WM_SETFOCUS, 0, 0);
This works fine as it set the focus but when i try to write anything on edit box it doesn't accept... Also when i press TAB button after that it behaves normally i.e it allows you to write...
what could be the problem??
Thanks..
Ash..
|
|
|
|
|
AFAIK, the WM_SETFOUCS message is not used to set foucs to a control. But it is send to notify that the window has got the Focus.
You should use SetFoucs() function to set focus to a control.
|
|
|
|
|
Thanks for your reply Naveen..
I tried SetFocus Also but using SetFocus doesn't set Focus on edit box..Also i tried to set focus using SendMessage with appropriate parameter but it behave like PostMessage only...
Ash..
|
|
|
|
|
Ashish Chauhan wrote: tried SetFocus Also but using SetFocus doesn't set Focus on edit box
Inside which functon ur calling the SetFoucs()? Also I hope u have called the SetFoucs() as follows
m_edit.SetFocus();
Where m_edit is the member variable of the CEdit.
|
|
|
|
|
Well it's Non-MFC Application...
I'm working on property sheet which contains 4 tabs(Property Pages)..On first tab(Page) i'm using controls(Edit Box,Radio Button, Check Button etc)... So i want whenever the page initializes the focus should be on my edit box..
I'm using SetFocus on "case WM_INITDIALOG"
Ash..
|
|
|
|
|
Ashish Chauhan wrote: I'm using SetFocus on "case WM_INITDIALOG"
1) Did u try setting the tab order?
or
2) If you have called the SetFoucs() inside the WM_INITDIALOG, then the WM_INITDIALOG must return FALSE. Other wise there will not be any effect for the SetFoucs().
|
|
|
|
|
Can you elaborate more on setting the tab order? Or may be you can redirect me to appropriate tutorials...
Ash..
|
|
|
|
|
Also the edit box is on first tab only and it's the default page..
Ash..
|
|
|
|
|
Do the property sheet have a parent dialog? If so what did the WM_INITDIALOG of dialog return?
I think Dialog, Property sheet and Property page should return FALSE in response to WM_INITDIALOG..
|
|
|
|
|
Yeah right Naveen it's returning FALSE...
Nope property sheet don't have parent dialog...
Ash..
|
|
|
|
|
|
|
Why are you not using WM_NEXTDLGCTL ?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hi all,
Is there an easy way to convert a date in string format for example
a = "Fri Oct 13 01:32:38 CDT 2006"
then converts it to
"Fri 13 Oct 2006 01:32:38 -0500"
or
"Fri 13 Oct 2006 01:32:38 CDT"?
Is there a function for that or I need to parse it?
any suggestion if I need to parse it are highly appreciated.
Thanks,
Jj
|
|
|
|
|
If you could somehow manage to get the string formatted like "Oct 13, 2006 01:32:38", then you could use COleDateTime::ParseDateTime() . If not, you can easily parse it yourself.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|