Solved

Waitforsingleobject always results in a timeout !!!

Posted on 2004-08-03
3
1,816 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

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

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‚Ķ
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
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.
This video explains how to create simple products associated to Magento configurable product and offers fast way of their generation with Store Manager for Magento tool.

708 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

14 Experts available now in Live!

Get 1:1 Help Now