multi thread et accés via un controleur

2»

Réponses

  • schlumschlum Membre
    20:51 modifié #32
    dans 1191592243:
    ps : a quoi peu bien servir la methode currentThread qui retourne un NSThread* si on ne peut pas manipuler le thread a partir d'un pointeur

    À savoir dans quel thread on est à  un moment donné...
  • hcyranohcyrano Membre
    20:51 modifié #33
    oui, pour les logs en debug :)
  • schlumschlum Membre
    20:51 modifié #34
    dans 1191594432:

    oui, pour les logs en debug :)

    Déjà , oui  :)
    Mais pas seulement...
  • schlumschlum Membre
    octobre 2007 modifié #35
    Apparemment ils ont désactivé exprès PTHREAD_CANCEL_ASYNCHRONOUS  :-\\ (et c'est pas au niveau de mach, mais au niveau de la bibliothèque pthread...)

    Et ça date !
    http://lists.apple.com/archives/darwin-development/2002/Sep/msg00046.html

    We had intended to include proper pthread_cancel() support in Jaguar/Darwin 6.0. However, we ran into too many places throughout the rest of libSystem and the other Mac OS X framework libraries that would be broken by true ASYNCHRONOUS pthread_cancel() use. Rather than enable a tool that would break the application/frameworks at random times, we left it disabled.

    We have been working on a plan to "safely" enable it for another future release. In our view, we need at least libSystem cancel-safety to turn it on at all.
  • GGGG Membre
    20:51 modifié #36
    dans 1191591022:

    Contrairement à  ce qu'on disait au dessus, gérer ses threads avec la bibliothèque POSIX n'est pas si compliqué que ça... Il faut juste lancer un thread vide avec "detachNewThreadSelector:toTarget:withObject:" au début de l'application pour la mettre en mode multi-threadée et après on fait ce qu'on veut avec la bibliothèque qu'on veut.

    Je suis en train de faire des tests dessus, mais je n'arrive pas à  faire fonctionner "PTHREAD_CANCEL_ASYNCHRONOUS"  >:(
    Par contre, "PTHREAD_CANCEL_DEFERRED" avec des "pthread_testcancel" dans le code fonctionne très bien.


    Tu implémentes ça comment ?
    tu refais une classe thread qui encapsule les threads posix ?
  • schlumschlum Membre
    20:51 modifié #37
    dans 1191596236:

    Tu implémentes ça comment ?
    tu refais une classe thread qui encapsule les threads posix ?


    Non, directement...

    #import &lt;Foundation/Foundation.h&gt;<br />#import &quot;TestObj.h&quot;<br />#include &lt;pthread.h&gt;<br />#include &lt;unistd.h&gt;<br /><br />void *threadFunc(void *obj);<br />void cleanupObj(void *obj);<br /><br />int main (int argc, const char * argv&#91;]) {<br />&nbsp; &nbsp; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br />	<br />	TestObj *test = [TestObj testObj];<br />	<br />	[NSThread detachNewThreadSelector:@selector(vide:)<br />							 toTarget:test<br />						&nbsp; &nbsp;withObject:NULL];<br />	<br />	pthread_t thread;<br />	<br />	pthread_create(&amp;thread,0,threadFunc,(void*)test);<br />	pthread_detach(thread);<br />	usleep(2000000);<br />	int res = pthread_cancel(thread);<br />	NSLog(@&quot;pthread_cancel (%d)&quot;,res);<br />	<br />	<br />&nbsp; &nbsp; [pool release];<br />	pthread_exit(NULL);<br />&nbsp; &nbsp; return 0;<br />}<br /><br /><br />void *threadFunc(void *obj)<br />{<br />	[(TestObj*)obj retain];<br />	pthread_cleanup_push(cleanupObj,obj);<br />	int oldState,oldType;<br />	int res1 = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&amp;oldState);<br />	int res2 = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&amp;oldType);<br />	NSLog(@&quot;Old cancel state : %d (%d) type : %d (%d)&quot;,oldState,res1,oldType,res2);<br />	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br />	pthread_cleanup_push(cleanupObj,(void*)pool);<br />	[(TestObj*)obj thread];<br />	pthread_cleanup_pop(0);<br />	[pool release];<br />	pthread_cleanup_pop(0);<br />	[(TestObj*)obj release];<br />	pthread_exit(NULL);<br />}<br /><br />void cleanupObj(void *obj)<br />{<br />	[(NSObject*)obj release];<br />}
    


    //<br />//&nbsp; TestObj.m<br />//&nbsp; TestPOSIXThread<br />//<br /><br />#import &quot;TestObj.h&quot;<br />#include &lt;unistd.h&gt;<br /><br />@implementation TestObj<br /><br />- (id)init<br />{<br />	if((self=[super init])!=nil)<br />		NSLog(@&quot;TestObj (%x) : init&quot;,(int)self);<br />	return self;<br />}<br /><br />- (void)dealloc<br />{<br />	NSLog(@&quot;TestObj (%x) : dealloc&quot;,(int)self);<br />	[super dealloc];<br />}<br /><br />- (void)vide:(id)obj<br />{<br />	[NSThread exit];<br />}<br /><br />- (void)thread<br />{<br />	NSLog(@&quot;Thread&quot;);<br />	TestObj *test2 = [TestObj testObj];<br />	NSLog(@&quot;Description : %@&quot;,[test2 description]);<br />	int i;<br />	for(i=0;i&lt;10;++i) {<br />		NSLog(@&quot;Thread sleeping...&quot;);<br />		usleep(500000);<br />		pthread_testcancel();<br />	}<br />}<br /><br />- (id)retain<br />{<br />	NSLog(@&quot;TestObj (%x) : retain&quot;,(int)self);<br />	return [super retain];<br />}<br /><br />- (oneway void)release<br />{<br />	NSLog(@&quot;TestObj (%x) : release&quot;,(int)self);<br />	[super release];<br />}<br /><br />+ (TestObj*)testObj<br />{<br />	TestObj *res = [[[TestObj alloc] init] autorelease];<br />	return res;<br />}<br /><br /><br /><br />@end
    


    Mais en enlevant le "pthread_testcancel" ça ne fonctionne plus ; donc il faut quand même mettre régulièrement des "cancellation points" (même si on s'assure que son thread est cancel-safe)

    Tout ça parce qu'ils ont codé leurs Framework comme des cochons !
Connectez-vous ou Inscrivez-vous pour répondre.