• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Using POSIX threads with Cocoa?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Using POSIX threads with Cocoa?


  • Subject: Re: Using POSIX threads with Cocoa?
  • From: Vince Ackerman <email@hidden>
  • Date: Mon, 19 Apr 2004 08:38:41 -0700

I posted this in the mt-smp list as well and so far no one's weighed in.... can anyone help?


On Apr 17, 2004, at 10:38, Vince Ackerman wrote:

I'm new to Obj C and I don't know much about using threads as I've been away from Mac and C programing for a long time. Hope you guys can help. I've been trying to learn Obj C by writing an app in Cocoa that uses a third parties library to control some USB devices and have run into several problems (previously was the C style callback topic). I've asked the authors of the library/devices I'm using for help but they're not Cocoa programmers and can't really figure out why it's not woking (though they're in the process of learning Cocoa.... I hope).

It looks like they're running several threads in their sample code, one's a timer function and another an input thread.

Here are two functions that they want me to call after I do some initialization stuff (these are built into their library):

static TeleoInterface* teleoInterface;
static pthread_t teleoInputThread;
static pthread_t teleoTimerThread;
static pthread_mutex_t teleoThreadMutex;

void TeleoEasy_Start()
{
// Create the mutex
pthread_mutex_init( &teleoThreadMutex, NULL );
// Fire up the input thread
pthread_create( &teleoInputThread, NULL, doInput, NULL );
// Fire up the timer thread
pthread_create( &teleoTimerThread, NULL, doTimer, NULL );
}

void TeleoEasy_Continue() // Waits for the library to exit
{
pthread_join( teleoInputThread, NULL );
pthread_join( teleoTimerThread, NULL );
pthread_mutex_destroy( &teleoThreadMutex );
}

void* doTimer( void *data )
{
uint8 c;

while( true )
{
TeleoEasy_Lock();
TC_timerEvent( teleoChannel, EVENT_TIME );
TMM_timerModuleEvent( teleoModuleManager, EVENT_TIME );
TeleoEasy_Unlock();

usleep( EVENT_TIME * 1000 );
}
}

void* doInput( void* data )
{
uint8 c;

// see what characters there are ready to look at
while ( 1 )
{
if ( TI_get( teleoInterface, &c, 1 ) == TELEO_OK )
{
//printf( "%d ", c );
TeleoEasy_Lock();
TC_input( teleoChannel, c );
TeleoEasy_Unlock();
}
}
return NULL;
}

The TeleoEasy_Continue() call appears to be a run loop (they call it in main() ) which interferes with NSApplicationMain(argc, argv). If I comment it out, NSApplicationMain works, and the callbacks I've set up work fine, but the getvalue() setvalue() stuff I need to call doesn't seem to go any where. At launch time I've detached a dummy NSThread since the Apple Cocoa docs say you have to force Multithreading:



- (void) dummyThread: (id) dummyObject
{
int x,y;
for(x = 0,y = 0; x<10; x++) // Not sure what I need to accomplish in the dummy thread?
{
y = x;
}
}

- (BOOL) startMultithread
{

[NSThread detachNewThreadSelector:@selector(dummyThread:) toTarget:self withObject: NULL ];
return [NSThread isMultiThreaded];

}

// ------------------------------------------------------

The USB device docs also tell me that if I don't use the TeleoEasy_Continue() call then I must use their lock/unlock calls before using any of the setter/getter functions:


void TeleoEasy_Lock()
{
pthread_mutex_lock( &teleoThreadMutex );
}

void TeleoEasy_Unlock()
{
pthread_mutex_unlock( &teleoThreadMutex );
}

I have tried various combinations using the lock/unlock calls or the TeleoEasy_Continue() but it doesn't seem to matter. I'm not communicating with the devices for some reason. Not really knowing much about threads this maybe a stupid question, but should I be using NSLock instead? Don't know where to start looking for this answer. Apples docs don't say much except this:
//--------------------------------//
Using POSIX Threads

NSThreads are built upon POSIX threads (pthreads). You can create your own pthreads, but you must be cautious about using Cocoa from them. When you detach an NSThread, Cocoa enters a multithreaded mode, which activates greater thread safety measures. When you create your own pthreads, Cocoa does not know to change modes. To force Cocoa into its multithreaded mode, you must detach an NSThread, which could immediately exit. To identify whether Cocoa is already in multithreaded mode, use the NSThread class method isMultiThreaded.

If you need access to the pthread within an NSThread, call the pthread_self function from within that thread.

//-------------------------------//

Thanks in advance. This list and all it's members is an invaluable resource!

Vince
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.


References: 
 >Using POSIX threads with Cocoa? (From: Vince Ackerman <email@hidden>)

  • Prev by Date: Strange behaviour of text insertion in NSTextView
  • Next by Date: Re: CodeWarrior vs. Xcode?
  • Previous by thread: Using POSIX threads with Cocoa?
  • Next by thread: Re: Using POSIX threads with Cocoa?
  • Index(es):
    • Date
    • Thread