This is the mail archive of the pthreads-win32@sources.redhat.com mailing list for the pthreas-win32 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Threading Issue - Program hangs on Ctrl-C - URGENT PLZ


Hi,
I had a simple serial port communication application
which uses pthread-win32 for threading.

When the program exits, the application hangs and the
only way to recover is to restart the machine.

I have debugged and the issue seems to be regarding
thread handling or signal handling.

Code snippet is given below for reference. Feel free
to ask for more information.

Please reply asap. 
Many Thanks 
Amit
--- CODE STARTS ------------------------------
// all header files not shown

#include "pthread.h"
#include "signal.h"

// three threads for each ports
pthread_t t[3];		
int result = 0;
int tid1, tid2, tid3;

void* portOneFunc(void* arg);
void* portTwoFunc(void* arg);
void* portThreeFunc(void* arg);

CDataOne* data1 = NULL;
CDataTwo* data2 = NULL;
CDataThree* data3 = NULL;

// Custom Mutex class using pthread mutex
CMyMutex myMutex; 
CWinApp theApp;

//////////////////////////////////////////
// Main
//////////////////////////////////////////

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
// ---Initialize COMM Ports---
CCommPort p1(RS_COM1);	// COM1
CCommPort p2(RS_COM2);		// COM2
CCommPort p3(RS_COM3);		// COM3

// Init various Data Analyzers
data1 = new CDataOne();			
data2 = new CDataTwo();	
data3 = new CDataThree();	

try {
	// --------- Create Threads ------------
	// Pthread Create 		
	tid1 = pthread_create(
		&t[0], NULL, portOneFunc, &p1);
	tid2 = pthread_create(
		&t[1], NULL, portTwoFunc, &p2); 			
	tid3 = pthread_create(
		&t[2], NULL, portThreeFunc, &p3); 
			
	// -------- Wait for Threads to complete ----
	// Pthread Join
	int ret = 0;

	if (pthread_join(t[0], (void **) &result)) {
		cout << "pthread join error" << endl;
		
	}
	if (pthread_join(t[1], (void **) &result)) {
		cout << "pthread join error" << endl;			
	}
	if (pthread_join(t[2], (void **) &result)) {
		cout << "pthread join error" << endl;			
	}

} PtW32CatchAll {
	cerr << "ERROR : Thread Error" << endl;
} 

delete data1;
delete data2;
delete data3;

return 0;
}


//////////////////////////////////////////
// Thread Functions
//////////////////////////////////////////

void* PortOneFunc(void* arg) {
	
CCommPort *x_oPort1 = (CCommPort*)arg;

try {
   // Open Port with baudrate 4800
   if (x_oPort1->Open(RS_4800)) {			
       	cout << "COM1 Opened" << endl;
	do {				
	  // Get till terminating chars
	  string str = x_oPort1->GetLine().c_str();	 
myMutex.lock();				  // Append the data for further
analysis
	  data1->Append(str.c_str()); 
	  myMutex.unlock();
			
	} while(true);
	
	  // Close the port
	  x_oPort1->Close();
	} else {
	  cerr << "Error Opening COM 1 Port" << endl;
	}
} catch(...) {
	cerr << "ERROR : Thread Exception" << endl;
	//throw;
}
return (void*)true;
}

////////////////////////////////////////////
void* PortTwoFunc(void* arg) {

CCommPort *x_oPort2 = (CCommPort*)arg;

try {
	// Open Port		
	if (x_oPort2->Open(RS_1200)) {		
	  cout << "COM2 Opened" << endl;
	  do {				
	     string str = x_oPort2->GetLine().c_str();
	     myMutex.lock();				
	     data2->Append(str.c_str());
	     myMutex.unlock();
	  } while(true);		
	  x_oPort2->Close();	
	} else {
   	cerr << "Error Opening COM 2 Port" << endl;
	}
} catch(...) {
	cerr << "ERROR : Thread Exception" << endl;
	//throw;
}
return (void*)true;
}

////////////////////////////////////////////
void* PortThreeFunc(void* arg) {

CCommPort *x_oPort3 = (CCommPort*)arg;

try {
   // Open Port		
   if (x_oPort3->Open(RS_1200)) {		
	cout << "COM3 Opened" << endl;
	do {				
         string str = x_oPort3->GetLine().c_str();
	 myMutex.lock();				 data3->Append(str.c_str());
	 myMutex.unlock();
	} while(true);		
	  x_oPort3->Close();	
   } else {
	cerr << "Error Opening COM 3 Port" << endl;
   }
} catch(...) {
   cerr << "ERROR : Thread Exception" << endl;
   //throw;
}

return (void*)true;
}
-- CODE ENDS ------------------------------







__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]