|
Rickard Andersson wrote:
and did you mean that EnterCriticalSection will lock for ever if I don't have an __try/__finally statement?
MAY lock forever, not WILL lock forever.
If you have a bug in the code between the Enter/Leave pair, your code may not execute the Leave part, leaving the CS locked forever.
So, take care with the code you put between this.
That's why the __try/__finally is there: as an assurance that the Leave will execute always, even on crash or error situations.
Q261186 - Computer Randomly Plays Classical Music
|
|
|
|
|
I personally don't like the __try/__finally. If an error happens that leaves the global data in an unstable state, simply releasing the critical section, absent anything else, isn't going to make the code any more stable and arguably less.
|
|
|
|
|
Basically yes. Be aware, however, that the critical section should be as short as possible to prevent thread stalling. I would examine your global data carefully to make sure you aren't guarding things that don't need guarding.
In other words, if the global data in question is a series of unrelated items, you don't want to guard all of them with a single critical section; a common mistake.
Also be aware that if you need to share a single value, check out the Interlocked...() series of calls.
|
|
|
|
|
Joe Woodbury wrote:
I would examine your global data carefully to make sure you aren't guarding things that don't need guarding.
I'm working on a server that will save all clients in a global std::list object. When a client whants to send to another client on the server, the client iterate through the std::list object and send the message to all clients.
Isn't it good to make a critical section here?
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
Yes. I think (I'm still not clear how many threads you have, etc.)
(Since it looks like you have a one writer, multiple readers issue, the CriticalSection will block all readers even when a write isn't being done. However, there is no synchronization object designed specifically for this, though you can make a compound object. I have and in real world testing it was much slower than plain Critical Sections. However, this assumes that the read operations are extremely short and can easily occur in a single time slice.)
|
|
|
|
|
Joe Woodbury wrote:
I'm still not clear how many threads you have, etc.)
I will have about 100 threads only.
perhaps 150, but for now 100 is what the first version of my server will have.
Joe Woodbury wrote:
(Since it looks like you have a one writer, multiple readers issue, the CriticalSection will block all readers even when a write isn't being done. However, there is no synchronization object designed specifically for this, though you can make a compound object. I have and in real world testing it was much slower than plain Critical Sections. However, this assumes that the read operations are extremely short and can easily occur in a single time slice.)
But if don't make up a critical section when I read the object?
As Moak said in the message down here it is always safe to READ a global data in multiply threads. then it would be safe, wouldn't it?
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
You should seriously consider using I/O completion ports. It's perfect for what you're doing.
|
|
|
|
|
Where can I read more about that!?
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
The MSDN documentation has a hopelessly incomplete description. The best discussion is in an out-of-print Jeffrey Richter book "Programming Server-Side Applications for Microsoft Windows 2000."
Perhaps, someone should ask Richter if CP can "reprint" the chapter.
|
|
|
|
|
Rickard Andersson wrote:
I'm working on a server that will save all clients in a global std::list object. When a client whants to send to another client on the server, the client iterate through the std::list object and send the message to all clients.
Hej Rickard,
with a mutithreading socket concept this is a must have IMHO. Reading isn't critical, but changing or removing elements from a list: Another task could e.g. remove an element from the list (when a client signs off), which could invalid the iterator used by another thread. So, that's why you have to make exclusive access to your global network data, no matter if threads wants to read or write.
|
|
|
|
|
Thaaaaaaaaaaank you Moak!
See your ICQ for an important message from me!
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
no problem... mompl, starting ICQ...
|
|
|
|
|
[ Returning to the doc-view architecture after 8 years, so excuse the lameness of this question! ]
I have an MDI app that's capable of displaying documents of type CFooDoc and CBarDoc . I've modified the file opening logic to restrict the number of open CFooDoc documents to 1.
What I want to do is automagically close all CBarDoc documents when the user closes the solitary CFooDoc document. I can do this by calling the CloseAllDocuments() on CBarDoc 's doc template.
My question is, how do I detect that the CFooView is closing?
Thanks,
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Never mind. I just overrode the parent frame's OnClose() .
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Hi Ravi,
Or in ~CFooView() or CFooView::PostNCDestroy() or ...
Neville Franks, Author of ED for Windows. www.getsoft.com
|
|
|
|
|
Hi Neville,
Actually the tack I took only handled the case when the user closed the view manually by clicking the "x" button. It didn't handle the ID_FILE_CLOSE case, so I used a custom command and handled document closure myself.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Hi,
how can i add a menu in a dialog based application??
|
|
|
|
|
Create a menu in the resource editor, then modify the dialog's "Menu" property (also in the resource editor) to point to that menu.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
the first,you create a new menu whit ID_DLG_MENU
the second,see the dialog property.
select the ID_DLG_MENU int the Menu:
|
|
|
|
|
I have a dialog template. I create a CPropertyPage class on it, and add it to my property sheet.
On this dialog, I have a combo box as a drop list. My question is: the combo box content is added at run-time. Its string format is as follows:
%2d: %-35s %02d
The problem is: using the default font, the string part will have variable length. I tried to overwrite the OnSetFont() as:
if ( HFONT(myFont) )
{
pFont->DeleteObject();
pFont = &myFont;
}
CPropertyPage::OnSetFont(pFont);
I have tried to use different font, "Arial", "Courier", "System", "Times New Roman", but all of them gave me a big bold ugly font displayed on the dialog.
what's the correct way to do it?
Thank you a lot!
|
|
|
|
|
I'm not sure I understand what the problem is...
Your string part will be variable width...? Whys that a bad thing...?
I suppose your gonna wanna use a fixed width font like Courier New (Courier should work also???)
What are you trying to acocmplish...? Just change the font..?
Do it inside InitDialog() with a call to the controls SetFont()
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
Hi
I want to store IPs in a linked list using CList , but don't know how to do that. Servers already in the list should not be stored in the list again. Currently I can't compile my project due to errors.
This is what I want to do:
CList<sockaddr_in, sockaddr_in&> SockList
for(int i=0; i<num_servers; i++)
{
if(SockList.Find(server) == NULL)
SockList.AddTail(server);
}
server is of type sockaddr_in* .
How can I achieve this?
thanks in advance
Greg
modified 12-Sep-18 21:01pm.
|
|
|
|
|
You cannot search a list of pointer using its default equality comparison.
I recommend an STL list or map and with a custom equality or equivalent search algorithm via a function object.
Kuphryn
|
|
|
|
|
Thanks
Is there no way to copy the values of a sock_addr* pointer into a normal sock_addr variable?
This way it would be possible, or am I wrong?
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Consider memcpy(). I am not completely sure that will work for sock_addr.
Kuphryn
|
|
|
|