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]

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



Hi Amit,
In all your thread functions , you have statement do { } while(true) and trying to read from comm ports.
I guess you are looking for a graceful way of shutting down the threads.
i will suggest you to set a global variable something like timeToExit = 1;
change the condition to run the thread for ever to do { } while(timeToExit)
and when your applicaion catches Ctrl+C or any unwanted signal set the timeToExit to 0 which will cause all the threads to exit.


I guess it may solve the issue.
Thanks
Jas



From: amit mishra <infoworldindia@yahoo.com>
To: pthread <pthreads-win32@sources.redhat.com>
Subject: Re: Threading Issue - Program hangs on Ctrl-C - URGENT PLZ
Date: Fri, 17 Oct 2003 23:14:08 -0700 (PDT)

Hi Ross,

Thanks for the reply.
I suppose the threads are not able to exit properly.
Since all the threads are never going to terminate as
it continues to read from respective COM ports, there
should be some mechanism to end the thread gracefully.

Could anyone give me sample code to test with for
handling signals like Ctrl-C or to gracefully end the
pthreads.

Also, what should be the ideal mechanism for ending
the threads when threads are continuosly running (i.e.
its not going to terminate until some signal like
Ctrl-C is given) ??

Many Thanks
Amit





--- Ross Johnson <rpj@callisto.canberra.edu.au> wrote:
> I don't have any direct experience in this area but
> I believe exception
> management in MT applications is tricky, so I
> apologise in advance for
> responding with questions.
>
> Questions:
> What happens to the other threads when one thread
> catches the exception
> generated by ctrl-C?
> What if the exception arrives while the thread holds
> the mutex?
>
> Ross
>
> amit mishra wrote:
>
> >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 ------------------------------
> >
> >
> >
>
=== message truncated ===


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

_________________________________________________________________
Get 10MB of e-mail storage! Sign up for Hotmail Extra Storage. http://join.msn.com/?PAGE=features/es



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