Una primera prova d'un Thread

Bé, ja he fet una petita prova de treballar amb threads. He fet una petita aplicació que executa dos fils iguals amb prioritats diferents.

L'avantatge dels fils és que es permet seguir treballant amb la interfície gràfica mentre s'executen les funcions. Fins i tot es pot tancar l'aplicació sense que els fils hagin acabat.

He volgut provar les prioritats per comprovar si al ficar una prioritat a "0" el fil s'executava. I sí, s'executa de totes formes. Encara que triga bastant més.

Aquest és el codi del controlador MainCtrl.h

#import <Cocoa/Cocoa.h>

@interface MainCtrl : NSObject
{
IBOutlet NSSlider *oPriority1;
IBOutlet NSSlider *oPriority2;

NSNumber *counter1;
NSNumber *counter2;
}

#pragma mark Thread Methods
- (void) threadCounter:(NSString*)tName;
- (void) threadCounter1;
- (void) threadCounter2;

#pragma mark Access Methods
- (void) setCounter1:(NSNumber*)tNum;
- (void) setCounter2:(NSNumber*)tNum;

#pragma mark Action Methods
- (IBAction) actionStartThreads:(id)tSender;

@end

I aquest el del MainCtrl.m
#import "MainCtrl.h"

@implementation MainCtrl

- (id) init
{
if ( self = [super init] )
{
[self setCounter1:[NSNumber numberWithInt:0]];
[self setCounter2:[NSNumber numberWithInt:0]];
}
return self;
}

- (void) dealloc
{
[counter1 release], counter1 = nil;
[counter2 release], counter2 = nil;
[super dealloc];
}

- (void) setCounter1:(NSNumber*)tNum
{
[counter1 release];
counter1 = [tNum retain];
}

- (void) setCounter2:(NSNumber*)tNum
{
[counter2 release];
counter2 = [tNum retain];
}

- (void) threadCounter:(NSString*)tName
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
unsigned long i, j;

for ( j = 0; j < 100; j++ )
{
[self setValue:[NSNumber numberWithInt:j] forKey:tName];
for ( i = 0; i < 10000000; i++ )
{
}
}

[pool release];
}

- (void) threadCounter1
{
[NSThread setThreadPriority:[oPriority1 floatValue]];
[self threadCounter:@"counter1"];
}

- (void) threadCounter2
{
[NSThread setThreadPriority:[oPriority2 floatValue]];
[self threadCounter:@"counter2"];
}

- (IBAction) actionStartThreads:(id)tSender
{
[NSThread detachNewThreadSelector:@selector(threadCounter1)
toTarget:self
withObject:nil];
[NSThread detachNewThreadSelector:@selector(threadCounter2)
toTarget:self
withObject:nil];
}


@end

Si teniu un ordinador més ràpid que el meu, canvieu els valors dels bucles for, per a que pugueu veure com augmenten els valors.

Xin  sep  06 octubre 2008 12:08

Com sempre envio el missatge abans d'enganxar-hi l'enllaç de la imatge. :-((

imatge

Xin  sep  06 octubre 2008 12:12

Bé, m'ho he estat estudiant i encara no acabo d'entendre com funciona, però per el que sembla els threads son útils per tasques concretes i no per fer un seguiment i controlar un altre thread, es per això que de moment no m'hi he ficat mes. Una llàstima perquè pensava que era la solució per un problema que tenia, però estava trigant massa i m'he tingut que ficar a fer altres coses.

 sep  31 octubre 2008 12:17

Selecciona'l abans d'enviar el commentari