[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

Problems with threads.

Posted on 1999-01-21
6
Medium Priority
?
474 Views
Last Modified: 2013-11-20
Hello!
I have a multithreaded Client/Server. When clients are beginning to connect to this, the of all OS begins to work slow (immediately when I start new threads, the system works visible slower - after only two threads!!). The priority of threads is normal. The C-S communication is done through TCP/IP, using handles to CAsyncSocket derived classes, using WinSock API.
What is the problem??
Here is the looping code of the threads, which communicate with clients:

while (WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT)
      {
            i =  recv( m_hSocket, b, 2, 0);
            if (i == 2)
            {
                    Do something.....
            }
            if (i == SOCKET_ERROR )
            {
                  switch (WSAGetLastError())
                  {
                  case WSAETIMEDOUT :
                  case WSAECONNRESET :
                  case WSAECONNABORTED :
                        {
                              m_theMessage = "@@##$$conerr";
                              ProcessPendingRead();
                              WaitForSingleObject(m_hEventKill, INFINITE);
                        }
                  }
            }
      };
0
Comment
Question by:tmolnar
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
6 Comments
 

Author Comment

by:tmolnar
ID: 1328104
Edited text of question
0
 
LVL 4

Accepted Solution

by:
piano_boxer earned 200 total points
ID: 1328105
You are doing a BUSY wait because the timeout value for WaitForSingleObject is zero.

You can switch to using CAsyncSocket class the handles incomming data async. Derive your own class from CAsyncSocket and override OnReceive() and OnClose() functions.

OnReceive() will be called when there are some data ready to be read, and OnClose() will be called when the socket is closed.

You can add the derived CAsyncSocket class as a variable in you CWinApp and initialize it in OnInitInstance():

OnInitInstance(...)
{
   [...]
   m_MySocket.Create(12345, SOCK_STREAM, FD_READ|FD_CLOSE);
   [...]
}


Another solution is to use Winsock2 and use the WSAEventSelect function to enable signalling of a Win32 event when something happens on the socket.
0
 

Author Comment

by:tmolnar
ID: 1328106
If I do that, I have to cut out the will the
while (WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT)
{
  ...
}
to avoid the busy wait...
But how to know, that the main thread want to kill the thread?
(see the m_hEventKill event)
Anoher question: the OnReceive() function will be called by the system, and will be work in the main thread on in the "client" thread?
Another problem is, that when I try to read in nonblocking mode all the time, I got an error, when the connection failed. How to get a corresponding error notification, if I use a CAsyncSocket derived class (something like On Error())?
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 4

Expert Comment

by:piano_boxer
ID: 1328107
I just re-read the question and there is really no need for you to use the thread function if you use the CAsyncSocket class.

Just drop the thread-thing for now.

The CAsyncSocket::OnReceive() function is call in the context of the thread that created the socket and is called by MFC through an internal hidden window MFC creates in CAsyncSocket::Create(). Windows posts socket event messages to this hidden windows and MFC calls the OnXxxx messages in response to them.

To read data from the socket do something like this in your OnReceive() overriden function:

void CMySocket::OnReceive(int nErrorCode)
{
    BYTE buf[512];
    CString strFromAddr;
    UINT nFromPort;

    int len = ReceiveFrom(buf, sizeof(buf), strFromAddr, nFromPort);
    if(len==0)
        // Connection closed !!!
    if(len>0)
    {
        // Use data in the buffer (buf).
    }
}

Here you also get the IP address and port of the sender. If you dont want this, just use the Receive() call instead.

Look at the nErrorCode passed to OnReceive() for errors.
0
 

Author Comment

by:tmolnar
ID: 1328108
Thax!! It's OK now...
0
 

Author Comment

by:tmolnar
ID: 1328109
Thanx!! It's OK now...
0

Featured Post

Moving data to the cloud? Find out if you’re ready

Before moving to the cloud, it is important to carefully define your db needs, plan for the migration & understand prod. environment. This wp explains how to define what you need from a cloud provider, plan for the migration & what putting a cloud solution into practice entails.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
Introduction: Displaying information on the statusbar.   Continuing from the third article about sudoku.   Open the project in visual studio. Status bar – let’s display the timestamp there.  We need to get the timestamp from the document s…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
Suggested Courses

656 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question