Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Waitforsingleobject always results in a timeout !!!

Posted on 2004-08-03
1
Medium Priority
?
2,080 Views
Last Modified: 2013-12-03
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
                                 }//End of Wait Comm Event
          }// End of Waiting on Read
         
     
     }

         
     }
     
 
/*********************************************************************************************
0
Comment
Question by:shubha_mohan
1 Comment
 
LVL 48

Accepted Solution

by:
AlexFM earned 1000 total points
ID: 11704971
0

Featured Post

[Webinar] Cloud Security

In this webinar you will learn:

-Why existing firewall and DMZ architectures are not suited for securing cloud applications
-How to make your enterprise “Cloud Ready”, and fix your aging DMZ architecture
-How to transform your enterprise and become a Cloud Enabler

Question has a verified solution.

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

This article describes how to add a user-defined command button to the Windows 7 Explorer toolbar.  In the previous article (http://www.experts-exchange.com/A_2172.html), we saw how to put the Delete button back there where it belongs.  "Delete" is …
In this article, I will show how to use the Ribbon IDs Tool Window to assign the built-in Office icons to a ribbon button.  This tool will help us to find the OfficeImageId that corresponds to our desired built-in Office icon. The tool is part of…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Integration Management Part 2

963 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