Solved

Waitforsingleobject always results in a timeout !!!

Posted on 2004-08-03
3
1,829 Views
Last Modified: 2013-11-20
My waitforsingleobject always results in a timeout and i am unable to figure out why.. Please look at my code below..
i have a read file call .that gets called as soon as i receive a character in the input buffer. Hence i am waiting on waitcommevent and when a character appears, i issue a readfile to read all the characters that have come through my serial port.. However, waitcommevent is a blocking call. I had to make the waitcommevent timeout.. Hence, i moved to overlapped IO. But now..my waitcommevent always timeouts even though i know that there are characters to read. Please let me know what is wrong with my code..
/*********************************************************************************************/
int ReadProc1(char *str)
{
      
      /*
      Using the EV_RXCHAR flag will notify the thread that a byte arrived at the port. This event,
      used in combination with the ReadFile function, enables a program to read data only after
      it is in the receive buffer, as opposed to issuing a read that waits for the data to arrive*/


      DWORD dwCommEvent; //a variable that receives a mask indicating the type of event that occurred
      char chRead;            // Character read every time a read takes place.
      DWORD dwRead =0,Err,Bytes;            //Pointer to the variable that receives the number of bytes read
      char * str =calloc(100,sizeof(char));
      unsigned int i=0,j=2;
      BOOL fWaitingOnRead = FALSE,Ok= FALSE;

      OVERLAPPED osReader= {0};

      

      FillMemory(str, strlen(str), 0);
      //if((strcmp(p->PType,"13") == 0) && (strcmp(p->Data,"0") != 0)) stop = 0x06;
      if (stop == 0x06) terminate=1;
      if (stop == 0x03) terminate=0;
      
      
      memset(&osReader,0,sizeof(OVERLAPPED));
      osReader.hEvent = CreateEvent(
    NULL,   // no security attributes
    TRUE,  // auto reset event
    FALSE,  // not signaled
    NULL    // no name
    );
      if (osReader.hEvent == NULL)
      {
            LogEvent(hComm,"Error creating overlapped event");
      }

      for ( ; ; ) {
            if (!fWaitingOnRead)
            {

                  if (!(WaitCommEvent(hComm, &dwCommEvent,&osReader)))
                  {

                        if (GetLastError() != ERROR_IO_PENDING)
                        {
                              LogEvent (ghwnd," Error in Wait Comm Event");
                              return FALSE;
                        }
                        else
                        {
                              fWaitingOnRead = TRUE;
                              Err = WaitForSingleObject(hComm, READ_TIMEOUT);
                              
                              switch(Err)
                              {
                              case WAIT_TIMEOUT:
                                    LogEvent(ghwnd,"Timed out waiting for response from device.. check connections/power");
                                    return FALSE;
                                    break;


                              case WAIT_OBJECT_0:
                               // Event triggered. Check the status.
                                    
                                    Ok = GetOverlappedResult(hComm, &osReader, &Bytes, TRUE);
                                    if (Ok)
                                    {
                       
                                          do
                                          {
                                                                   
                                                if (ReadFile(hComm, &chRead, 1, &dwRead, NULL))
                                                {
                                          
                                                      // A byte has been read; process it.
                                                      str[i++]=chRead;
                                                                                                      }
                                                else
                                                {
                                                // An error occurred in the ReadFile call.
                                                      LogEvent(ghwnd," Read Failed With Error Code ");
                                                      break;
                                                }
                              
                                          } while (dwRead );
                                    }
                                    else
                                    {
                                          LogEvent(ghwnd,"Get Overlapped Result Failed ");
                                          return FALSE;
                                    }
                                    break;
                              default:

                                    LogEvent (ghwnd," Error in wait for single object");
                                    return FALSE;
                                    break;
                              }//End of Switch
                        }//End of GetLastError
                  }
                  else
                  {
                        LogEvent(ghwnd,"Read Completed Immedialtely");
                           /* So Proceed to readfile
                        do
                        
                        {
               
                              if (ReadFile(hComm, &chRead, 1, &dwRead, NULL))
                              {
                              
                                    // A byte has been read; process it.
                                    str[i++]=chRead;
                                    if(terminate ==1 && stop == 0x03) terminate += 1;
                                    if (chRead == stop )
                                    {
                                          terminate +=1;
                                    }
                              }
                              else
                              {
                                    // An error occurred in the ReadFile call.
                                    LogEvent(ghwnd," Read Failed With Error Code ");
                                    break;
                              }
                        
                        } while (dwRead );*/
                  }//End of Wait Comm Event
            }// End of Waiting on Read
            
      
      }

            
      }
      
 
/*********************************************************************************************
0
Comment
Question by:shubha_mohan
  • 2
3 Comments
 
LVL 48

Expert Comment

by:AlexFM
ID: 11704926
WaitCommEvent may return TRUE, in this case you can call ReadFile without waiting for overlapped event. Only if WaitCommEvent returns FALSE and GetLastError is ERROR_IO_PENDING, you need WaitForSingleObject.
WaitForSingleObject must wait for osReader.hEvent and not for hComm - this is your mistake.
There is not need in GetOverlappedResult - call ReadFile after successfull WaitForSingleObject.
0
 

Author Comment

by:shubha_mohan
ID: 11705575
Wow cool.. Thanks for locating my error !!! I still have anotehr doubt though.. Now.. that i have started using overlapped IO, can i not make any readfile /writefile calls that can be passed NULL instead of the OVERLAPPED object ?? Like in the above code, when my waitcommevent returns, i know that there is data to be read. i just want to gointo a loop reading off data till there is no more data to read.. However , a normal readfile call just returns an error (87 - ie parameter invalid") !! :(( Now .. is there any way i can overcome this problem ??
In simple words, i have an application where some calls need to be overlapped and some non overlapped . Is this possible at all ??
0
 
LVL 48

Accepted Solution

by:
AlexFM earned 250 total points
ID: 11706362
If you open COM port in overlapped mode, all calls to it should be overlapped as well. ReadFile call should have the same structure as WaitCommEvent call, plus using GetOverlappedResult:
- call ReadFile in overlapped mode.
- if returns TRUE, extract data immidiately.
- if returns FALSE and GetLastError is ERROR_IO_PENDING, call WaitForSingleObject, waiting for overlapped event.
- after succeessful execution of WaitForSingleObject call GetOverlappedResult to extract data.

From MSDN topic CreateFile:
FILE_FLAG_OVERLAPPED
When you specify FILE_FLAG_OVERLAPPED, the file read and write functions must specify an OVERLAPPED structure. That is, when FILE_FLAG_OVERLAPPED is specified, an application must perform overlapped reading and writing.

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Named range not carried over 10 62
method notes when mouse over in eclipse 5 83
sum13 challenge 24 90
Dell Alienware Graphics Amplifier Driver for non-Alienware systems 18 195
Introduction: Load and Save to file, Document-View interaction inside the SDI. Continuing from the second article about sudoku.   Open the project in visual studio. From the class view select CSudokuDoc and double click to open the header …
Introduction: Hints for the grid button.  Nested classes, templated collections.  Squash that darned bug! Continuing from the sixth article about sudoku.   Open the project in visual studio. First we will finish with the SUD_SETVALUE messa…
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.
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

862 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

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now