Générateur de nombres 1er

prepa75prepa75 Membre
avril 2010 modifié dans Vos applications #1
Bonjour à  tous,

après une semaine de travail intensif Xcode m'a démangé  :P

Comme le dit le titre,mon programme génère des nombres 1ers .le résultat sera affiché dans un NStableView ,l'utilisateur pourra choisir soit les nombre premier jusqu'a un nombre Alpha soit les Beta-ème nombres premiers.

en plus de cela il y aura une NSProgressIndicator pour afficher la progression de la génération.

Sur le papier c'est tout beau mais voici mon 1er problème :

la barre de progression s'affiche uniquement lorsque la génération est terminée ,elle passe directement de 0% à  100%.pourtant j'ai mis un printf pour verifier que la valeur varie bien  :(

voici mon code :
-(IBAction)Generer:(id)sender<br />{<br />	nbactuel = 1;<br />	diviseur = 3.0;<br />	compteur = 2;<br />	nbmax = 10000;<br />	printf(&quot;le 1er nombre 1er est : 2&#092;n&quot;);<br /><br />do<br />	{<br />		nbdivisepair = nbactuel / 2.0;<br />		pourmilleprog = (1000*nbactuel)/nbmax ;				//détermination de la variable &quot;pourmille&quot;<br />		printf(&quot;pourmillage de la barre : %f&#092;n&quot; , pourmilleprog);<br />		[progression setDoubleValue:pourmilleprog];		//affichage de la barre de progression<br /><br />		if(nbdivisepair == floor(nbdivisepair))				//c&#39;est un nombre pair<br />			{		<br />				nbactuel++;									//on passe au nombre suivant<br />			}<br />										<br />		do{<br />			<br />		nbdivise = nbactuel / (diviseur*1.0);<br /><br />		if(nbdivise != floor(nbdivise))				//si le nombre n&#39;est pas divisible<br />			{<br />			diviseur++;								//on passe au diviseur suivant<br />			}<br />		<br />		else									<br />			{<br />				break;							//sinon on sort de la boucle for<br />			}<br />		<br />		if(nbdivise != floor(nbdivise) &amp;&amp; diviseur == nbactuel - 1)			//si le nombre n&#39;est divisible que par lui-même...<br />			{<br />				printf(&quot;le %deme nombre 1er est : %d&#092;n&quot; ,compteur, nbactuel);<br />				compteur++;<br />				 <br />			}<br />		}while (diviseur &lt;= nbactuel - 1);<br />		<br />	nbactuel++;<br />	diviseur = 3.0;					//reinitialisation du compteur<br />		<br />	}while(nbactuel &lt; nbmax);<br />}<br /><br />@end


«1

Réponses

  • yoannyoann Membre
    16:20 modifié #2
    Il faut que tu lance ton calcul dans un thread secondaire. Ici tu le fait dans ta runloop hors l'interface ne se met à  jour qu'à  chaque passage, hors tu bloque son execution jusqu'à  la fin de ta fonction.
  • zoczoc Membre
    16:20 modifié #3
    Normal, pendant que ton algo tourne, la "run loop" (boucle de messages) est bloquée, et donc toutes les mises à  jour de l'interface également...


    Dans une application graphique, les actions effectuées sur le thread principal de l'application doivent "rendre la main" à  la boucle de traitement des évènements le plus vite possible.


    La solution ici est de lancer un second thread qui va effectuer les calculs. MAIS cela soulève un autre problème: Un thread secondaire n'a pas le droit d'interagir directement avec l'interface graphique. Donc pour modifier la valeur de la barre de progression, il va falloir mettre en place un mécanisme de communication entre le thread secondaire et le thread principal. Dans ce cas, la solution la plus simple, c'est la méthode "performSelectorOnMainThread", à  utiliser dans le thread secondaire.
  • prepa75prepa75 Membre
    16:20 modifié #4
    Oula merci pour vos réponses mais jsuis perdu la  :P jvais jeter un coup d'oeil a la doc 
  • prepa75prepa75 Membre
    16:20 modifié #5
    2ème question  :P

    j'essaye désésperement de mettre un NSArray dans un NStableView et de l'afficher mais en vain !

    <br />NSNumber * nombre1 = [NSNumber numberWithInt:nbmax];	<br />	[monarray addObject:nombre1];<br />
    


    donc la si tout va bien j'ai un Array contenant un object ,qui a pour valeur "nbmax"...

    et je n'arive pas a trouver dans la doc la méthode qui permet de l'afficher dans le NStableView...

    merci pour vos réponses


  • LeChatNoirLeChatNoir Membre, Modérateur
    16:20 modifié #6
    Ben dans ta dataSource, tu dois avoir plusieurs fonctions.
    Au minimum :

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    // tu retourne [array count]


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    // tu retourne [[array objectAtIndex:indexPath] convertit en string... Fleme de chercher...]
  • prepa75prepa75 Membre
    16:20 modifié #7
    j'ai suivi le book de Hillegass concernant l'appel d'un tableau et voici mon code :

    - (int)numberOfRowsInTableView:(NSTableView *)tableView<br />{<br />	return [monarray count];<br />}<br /><br />-(id)tableView:(NSTableView *)tableview<br />			objectValueForTableColumn:(NSTableColumn *)tableColumn<br />			row:(int)row<br /><br />{<br />	NSNumber *v = [monarray objectAtIndex:row];<br />	return v;<br /><br />}
    


    mais je ne comprend rien du tout à  ces lignes,et encore moins comment fait-on pour afficher des valeurs grâce a la datasource  :'(
    une ame charitable pourrais m'expliquer l'utilité de ces 2 méthodes ?Mille merci par avance !
  • zoczoc Membre
    16:20 modifié #8
    dans 1270991497:

    Ben dans ta dataSource, tu dois avoir plusieurs fonctions.
    Au minimum :

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    // tu retourne [array count]


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    // tu retourne [[array objectAtIndex:indexPath] convertit en string... Fleme de chercher...]

    La réponse serait la bonne si on était dans la section iPhone, mais là , c'est une question concernant le SDK Mac  ;) . On n'a donc pas d'UITableView, mais des NSTableView.

  • prepa75prepa75 Membre
    16:20 modifié #9
    dans 1270994099:

    La réponse serait la bonne si on était dans la section iPhone, mais là , c'est une question concernant le SDK Mac  ;) . On n'a donc pas d'UITableView, mais des NSTableView.


    oui en effet j'avais remarqué,j'ai compris ce que Lechatnoir voulais me faire comprendre, mais je ne comprend pas comment remplir un tableView avec un array en utilisant datasource , le livre est pas du tout explicite sur ça et je n'ai pas trouver la solution dans la doc apple
  • Philippe49Philippe49 Membre
    16:20 modifié #10
    dans 1270986172:


    voici mon code :
    -(IBAction)Generer:(id)sender<br />		if(nbdivisepair == floor(nbdivisepair))				//c&#39;est un nombre pair<br />
    



    Un entier n est pair si (n%2==0)
    Un entier n est divisible par m si (n%m==0)

    Si les unsigned int ne te suffisent pas, tu peux toujours utiliser les long long
    ULLONG_MAX= 18 446 744 073 709 551 615 = 0xFFFFFFFFFFFFFFFF
  • Philippe49Philippe49 Membre
    16:20 modifié #11
    dans 1270992793:

    mais je ne comprend rien du tout à  ces lignes,et encore moins comment fait-on pour afficher des valeurs grâce a la datasource  :'(
    une ame charitable pourrais m'expliquer l'utilité de ces 2 méthodes ?Mille merci par avance !


    Il faut bien comprendre le principe. Lors d'un rafraichissement de la table view, c'est cette dernière qui interroge son data source. Tout ce que tu as à  faire c'est de prévoir les réponses.

    La table view demande à  son data source le nombre d'éléments à  présenter, elle appelle la méthode numberOfRowsIntableView, et on lui répond par

    - (int)numberOfRowsInTableView:(NSTableView *)tableView<br />{<br />	return [monarray count];<br />}<br />
    


    La table view demande ce qu'il faut afficher dans telle ligne via la méthode dédiée ci-dessous, on lui répond
    <br />-(id)tableView:(NSTableView *)tableview<br />			objectValueForTableColumn:(NSTableColumn *)tableColumn<br />			row:(int)row<br />{<br />	NSNumber *v = [monarray objectAtIndex:row];<br />	return v;<br /><br />}
    


    Il faut naturellement que soient inscris dans monarray les valeurs à  présenter.
    Si tu ne remplis pas monarray avant le lancement de l'application, il est bon de mettre une instruction [maTableView reloadData] afin d'informer la table view qu'il faut qu'elle demande les infos pour se rafraà®chir.

    signé : une âme charitable
  • prepa75prepa75 Membre
    avril 2010 modifié #12
    [EDIT]: j'avais pas collé le bon .m  ;)


    Merci beaucoup pour ta réponse Philippe, j'ai compris le fonctionnement 

    mais lorsque je génère le tableau(marche nikel dans la console) il ne s'affiche toujours pas...j'ai bien mit le reloadData aprés le remplissage du tableau pourtant.

    à  quoi correspond le pointeur a, car il n'est pas utilisé...est-ce normal ? doit d'on faire quelquechose de particulier dans IB ?

    voici le .m
    #import &quot;Nombres_Premier.h&quot;<br /><br /><br />@implementation Nombres_Premier<br /><br /><br />-(int)numberOfRowsInTableView:(NSTableView *)tableView<br />{<br />	return [monarray count];					//détermination du nombre de lignes<br />}<br /><br />-(id)tableView:(NSTableView *)tableview<br />objectValueForTableColumn:(NSTableColumn *)tableColumn<br />		&nbsp;  row:(int)row<br /><br />{<br />	NSNumber *a = [monarray objectAtIndex:row];		//remplissage des lignes<br />	return a;<br />	<br />}<br /><br />-(IBAction)Generer:(id)sender<br />{<br />	monarray = [[NSMutableArray alloc] init] ;			//allocation du tableau<br />	nbactuel = 1;<br />	diviseur = 3.0;<br />	compteur = 2;<br />	nbmax = 10000;<br />	printf(&quot;le 1er nombre 1er est : 2&#092;n&quot;);<br />	<br />	do<br />	{<br />		nbdivisepair = nbactuel / 2.0;<br />		[progression setDoubleValue:pourmilleprog];		//affichage de la barre de progression<br /><br />		if(nbdivisepair == floor(nbdivisepair))				//c&#39;est un nombre pair<br />			{		<br />				nbactuel++;									//on passe au nombre suivant<br />			}<br />										<br />		do{<br />			<br />		nbdivise = nbactuel / (diviseur*1.0);<br /><br />		if(nbdivise != floor(nbdivise))				//si le nombre n&#39;est pas divisible<br />			{<br />			diviseur++;								//on passe au diviseur suivant<br />			}<br />		<br />		else									<br />			{<br />				break;							//sinon on sort de la boucle for<br />			}<br />		<br />		if(nbdivise != floor(nbdivise) &amp;&amp; diviseur == nbactuel - 1)			//si le nombre n&#39;est divisible que par lui-même...<br />			{<br />				printf(&quot;le %deme nombre 1er est : %d&#092;n&quot; ,compteur, nbactuel);<br />				NSNumber * entier = [NSNumber numberWithInt:nbactuel];	<br />				[monarray addObject:entier];<br />				<br />				[table reloadData];<br />				<br />				compteur++;<br />				 <br />			}<br />		}while (diviseur &lt;= nbactuel - 1);<br />		<br />	nbactuel++;<br />	diviseur = 3.0;											//reinitialisation du compteur<br />		<br />		<br />		<br />	}while(nbactuel &lt; nbmax);<br />}<br />
    


    et le .h
    #import &lt;Cocoa/Cocoa.h&gt;<br /><br /><br />@interface Nombres_Premier : NSObject {<br /><br />	IBOutlet NSTextField *rang;<br />	IBOutlet NSMatrix *maxornot;<br />	IBOutlet NSScrollView *scroll;<br />	IBOutlet NSTableView *table;<br />	IBOutlet NSProgressIndicator *progression;<br />	IBOutlet NSLevelIndicator *progression2;<br />	<br />	 NSMutableArray *monarray;<br /><br />	int nbactuel;<br />	double diviseur;<br />	double nbdivisepair;<br />	double nbdivise;<br />	int compteur;<br />	double pourmilleprog;<br />	int nbmax;<br />}<br /><br />-(IBAction)Generer:(id)sender;<br />-(IBAction)Initialiser:(id)sender;<br />-(IBAction)Choixrang:(id)sender;<br />-(int)numberOfRowsInTableView:(NSTableView *)tableView;<br />-(id)tableView:(NSTableView *)tableview;<br /><br />@end
    


    Merci pour ton aide.


  • Philippe49Philippe49 Membre
    avril 2010 modifié #13
    dans 1270998210:

    mais lorsque je génère le tableau(marche nikel dans la console) il ne s'affiche toujours pas...j'ai bien mit le reloadData aprés le remplissage du tableau pourtant.


    1) A priori c'est ta fonction Generer qui crée le tableau ..
    [EDIT] le devrait être extérieur à  la boucle while pour ne pas recharger à  chaque création ...
    cela n'explique pas

    2) As-tu vérifié si tes méthodes sont appelées après le reloadData ?

    3) Sinon, les connections  IBOutlet et datasource sont-elles opérationnelles ?

    dans 1270998210:

    à  quoi correspond le pointeur a, car il n'est pas utilisé...est-ce normal ? doit d'on faire quelquechose de particulier dans IB ?

    Ben si il est utilisé. La tableview demande quel objet il faut présenter, on lui renvoie l'adresse de [monarray objectAtIndex:row] .

    <br />-(id)tableView:(NSTableView *)tableview<br />objectValueForTableColumn:(NSTableColumn *)tableColumn<br />		&nbsp;  row:(int)row<br /><br />{<br />	NSNumber *a = [monarray objectAtIndex:row];		//remplissage des lignes<br />	return a;<br />	<br />}<br />
    


  • NseaProtectorNseaProtector Membre
    16:20 modifié #14
    Le bouquin d'Hillegass tu l'as en anglais ou en Français ? Pense MVC, cette idée de programme est parfaite pour cela et pour le multi-thread.  Tu es sous snow léo ?
  • zoczoc Membre
    16:20 modifié #15
    dans 1271011103:

    Tu es sous snow léo ?

    Question judicieuse, parce que la problématique soulevée peut être élégamment résolue avec Grand Central Dispatch  ;)

  • Philippe49Philippe49 Membre
    avril 2010 modifié #16
    dans 1270986172:

    la barre de progression s'affiche uniquement lorsque la génération est terminée ,elle passe directement de 0% à  100%.pourtant j'ai mis un printf pour verifier que la valeur varie bien  :(


    Evidemment il y a le problème de la run loop, mais de toute façons le calcul des nombres premiers < 10000 ne prendra pas plus d'un dixième de seconde, alors même avec un thread on n'y verra que du feu. Il faudrait ralentir le calcul pour que le progress indicator bouge.


    Quand  à  l'algorithme lui-même, il y a surement mieux à  faire ...
  • prepa75prepa75 Membre
    16:20 modifié #17
    dans 1271001477:



    1) A priori c'est ta fonction Generer qui crée le tableau ..
    [EDIT] le devrait être extérieur à  la boucle while pour ne pas recharger à  chaque création ...
    cela n'explique pas

    2) As-tu vérifié si tes méthodes sont appelées après le reloadData ?

    3) Sinon, les connections  IBOutlet et datasource sont-elles opérationnelles ?



    1 - j'ai préféré le mettre à  l'intérieur du while pour que l'affichage se fasse en temps réel , mais je suppose qu'il doit y avoir le même problème de thread et runloop comme pour la barre de progression,donc je vais le sortir ;)

    3 - mon problème venais de la, j'avais bien mis les connections la 1ere fois , mais j'ai supprimer mon tableau et en le remettant j'ai oublier le datasource...

    En tout cas merci beaucoup ça marche comme je veux^^

  • prepa75prepa75 Membre
    16:20 modifié #18
    dans 1271011103:

    Le bouquin d'Hillegass tu l'as en anglais ou en Français ? Pense MVC, cette idée de programme est parfaite pour cela et pour le multi-thread.  Tu es sous snow léo ?


    Salut NseaProtector, j'ai le bouquin en français, et heuresement parsque même avec les explications en fr on s'y perd facilement  quand tu dit pense MVC cela signifie quoi ? j'ai beau cherché la dénomination exacte je n'ai que des idées farfelues  :P
    pour le multi-thread en effet je l'ai feuilleté et ça me paraissais assez compliqué, mais je vais m'y mettre vu que pour une simple génération de nombres 1ers on en a besoin 

    sinon oui en effet je suis sur Snow Léopard.
  • Philippe49Philippe49 Membre
    16:20 modifié #19
    dans 1271056748:


    1 - j'ai préféré le mettre à  l'intérieur du while pour que l'affichage se fasse en temps réel , mais je suppose qu'il doit y avoir le même problème de thread et runloop comme pour la barre de progression,donc je vais le sortir ;)

    ben oui


    Voilà  un code pour faire un tableau des nombres premiers : il est basé sur le fait que le plus petit diviseur premier de n est forcément déjà  dans le tableau, et qu'il est inférieur ou égal à  la racine carrée de n. (moins de 1 centième de seconde pour générer les 9592 nombres premiers < 100000)
    <br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#define nbmax 100000<br /><br />int main(void) {<br />	int i,n;<br />	int compteur = 1;<br />	int * tab=malloc(nbmax*sizeof(int));<br />	tab[0]=2;<br />	<br />	for(n=3;n&lt;=nbmax;n+=2){<br />		for(i=0;n%tab[i]!=0 &amp;&amp; tab[i]*tab[i]&lt;=n ;i++){<br />		}<br />		if(tab[i]*tab[i]&gt;n) tab[compteur++]=n;<br />	}<br />	<br />	<br />	printf(&quot;%d &#092;n&quot;,compteur);	<br />	free(tab);<br />	return 0 ;<br />}<br />
    
  • prepa75prepa75 Membre
    16:20 modifié #20
    dans 1271021369:


    Evidemment il y a le problème de la run loop, mais de toute façons le calcul des nombres premiers < 10000 ne prendra pas plus d'un dixième de seconde, alors même avec un thread on n'y verra que du feu. Il faudrait ralentir le calcul pour que le progress indicator bouge.

    Quand  à  l'algorithme lui-même, il y a surement mieux à  faire ...


    en fait je vais mettre un NStextField et l'utilisateur pourra choisir jusqu'a quel nombre il souhaite aller,donc ça peut prendre plusieurs secondes.

    quand à  l'algorythme je suis tout à  fait d'accord jme suis pas prit la tête j'ai comparé directement les nombres.
    Pour des idées d'améliorations je pense à  ça :

    enlever les multiples ,par ex 6,9,12 etc ainsi que 10,15,etc reutiliser les nombres 1er stockés dans le tableau.
    mais en règle générale,les nombres qui ne sont pas 1er ont des multiples qui sont dans les 1ers nombres donc le gain sera très minimime.

    dit moi si je me trompe,parsque je dit un truc mais c'est qu'une supposition  :P
  • prepa75prepa75 Membre
    16:20 modifié #21
    dans 1271057241:

    dans 1271056748:


    1 - j'ai préféré le mettre à  l'intérieur du while pour que l'affichage se fasse en temps réel , mais je suppose qu'il doit y avoir le même problème de thread et runloop comme pour la barre de progression,donc je vais le sortir ;)

    ben oui


    Voilà  un code pour faire un tableau des nombres premiers : il est basé sur le fait que le plus petit diviseur premier de n est forcément déjà  dans le tableau, et qu'il est inférieur ou égal à  la racine carrée de n. (moins de 1 centième de seconde pour générer les 9592 nombres premiers < 100000)


    waouw jsuis impressionné par ta solution,c'est tout bête et j'y avais pas pensé  o:)
    je vais retourner bosser mes math.... :'(

    Donc l'algorythme influence énormément le temps de calcul...logique mais j'aurai pas cru que ce soit aussi significatif sur les 10000 1ers nombres premiers 

  • Philippe49Philippe49 Membre
    16:20 modifié #22
    dans 1271057704:


    enlever les multiples ,par ex 6,9,12 etc ainsi que 10,15,etc reutiliser les nombres 1er stockés dans le tableau.
    mais en règle générale,les nombres qui ne sont pas 1er ont des multiples qui sont dans les 1ers nombres donc le gain sera très minimime.

    dit moi si je me trompe,parsque je dit un truc mais c'est qu'une supposition  :P


    C'est une belle et rapide solution aussi, penser à  utiliser le principe de la racine carrée : le premier nombre à  supprimer pour le nombre premier p est p*p, car 2p, 3p, ... (p-1)p ont forcément déjà  disparus quand on traite les multiples de p.
  • prepa75prepa75 Membre
    16:20 modifié #23
    dans 1271059879:


    C'est une belle et rapide solution aussi, penser à  utiliser le principe de la racine carrée : le premier nombre à  supprimer pour le nombre premier p est p*p, car 2p, 3p, ... (p-1)p ont forcément déjà  disparus quand on traite les multiples de p.


    je suis content que ça te convienne  en couplant les deux méthodes ont peut faire un Algo de folie  :D bon je me calme... :P

    j'ai encore 2-3 questions : concernant l'affichage instantané il faut que j'utilise le multi-thread,donc je vais m'y plonger...mais en l'utilisant peut-on aussi mettre en "Pause" le calcul,de manière à  utiliser le CPU pour d'autres applications,ou bien peut-on régler l'utilisation du CPU en fonction d'une barre gérée par l'utilisateur ?Et bien évidemment si c'est à  ma portée,parsque si c'est pas le cas ça attendra un ptit peu  :P

    2eme question : je souhaite afficher le n-ième nombre 1er dans le tableau en y ajoutant une 2eme colonne (par ex  : 456ème ---> 4654) il faut que j'utilise des groupes clés et utiliser un dictionnaire comme dans le books où il y a une autre méthode ?
  • Philippe49Philippe49 Membre
    avril 2010 modifié #24
    dans 1271081246:

    mais en l'utilisant peut-on aussi mettre en "Pause" le calcul,de manière à  utiliser le CPU pour d'autres applications,ou bien peut-on régler l'utilisation du CPU en fonction d'une barre gérée par l'utilisateur ?

    Mettre en pause ton thread, il n'y a sans doute aucune difficulté, sleepForTimeInterval par exemple
    Pour jouer sur les priorités des process, il y a + (BOOL)setThreadPriority:(double)priority qui doit correspondre aux fonctions getpriority, setpriority du C (voir les pages man). Mais il ne faut sans doute pas penser mobiliser le processeur pour son unique application.

    dans 1271081246:

    2eme question : je souhaite afficher le n-ième nombre 1er dans le tableau en y ajoutant une 2eme colonne (par ex  : 456ème ---> 4654) il faut que j'utilise des groupes clés et utiliser un dictionnaire comme dans le books où il y a une autre méthode ?

    Si tu veux, mais ici le 456-ème va se trouver à  placer avec row=456. Donc l'implémentation de
    – tableView:objectValueForTableColumn:row: 
    peut être simplement de renvoyer [NSNumber numberWithInt:row] si row==0, et le NSNumber de monarray autrement.
  • prepa75prepa75 Membre
    16:20 modifié #25
    merci Philippe,en regardant la doc,les méthodes de NSthread ont l'ai assez explicites 

    concernant ma 2eme question il faut que je mette une troisième méthode? parsque le remplissage des lignes ça va mais comment le programme sait à  quelle colonne il faut mettre telle objet ?
    je suis désolé si je parait lourd  ::) mais j'ai un peu de mal à  comprendre la logique Obj-C  :o

  • AliGatorAliGator Membre, Modérateur
    avril 2010 modifié #26
    Ne pas oublier quand on se pose des questions sur un sujet à  aller fouiller dans la doc... et pas que dans les classes mais surtout dans les Programming Guides et les Sample Codes.
    Tout est listé sur le Apple Developer Center, et tu as des références croisées un peu partout, en particulier sur la doc concernant classes : tu as en tout début de la doc avant le "Overview" un tableau qui indique la liste des "Companion Guides" ainsi que la liste des "Related Sample Codes", faut pas hésiter à  les consulter ça donne encore plus d'infos (pratiques et techniques, les principes, et tout) que juste la doc de la classe.


    Ainsi pour ton cas et tes questions posées plus haut je t'invite à  consulter :


    _____
    *Note par exemple que la gestion d'un thread n'est pas forcément aussi simple qu'il peut y paraà®tre : faut gérer sa RunLoop (et son AutoreleasePool) un minimum, il faut bien gérer et protéger les ressources (notions de mutex, utilisation de @synchronize, ...), vérifier qu'on ne fait pas de deadlock qui gèlerait le thread (voire l'appli) ou d'inversion de priorité... Bref, ce sont des concepts pas forcément méchants, mais qu'il faut connaà®tre pour pas faire n'importe quoi et pas se lancer tête baissée dans le sujet non plus.
  • prepa75prepa75 Membre
    16:20 modifié #27
    Salut Ali, En effet ça parait plus complexe le multi-thread vu comme ça  :)
    je vais bien lire la doc avant de m'y mettre 

    pour l'utilisation d'un Table View,je m'étais penché sur les liens que tu m'ai donné et je ne trouvais pas la réponse à  mes questions,je n'arrive pas en fait à  voir le moment où l'on dit que telle colonne correspond à  tel NSArray,j'ai regardé les samples codes de "MyPhoto" ainsi que l'exemple documenté;

    concrètement voici le bout de code qui me pose problème :

    je n'arrive pas a le transposé à  mon programme.

    - (id)tableView:(NSTableView *)aTableView<br />&nbsp; &nbsp; objectValueForTableColumn:(NSTableColumn *)aTableColumn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //celle là  je la comprend plus où moins car je l&#39;ai utilisé <br />&nbsp; &nbsp; row:(NSInteger)rowIndex<br />{<br />&nbsp; &nbsp; id theRecord, theValue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  //je suppose que l&#39;on déclare les objets que l&#39;on va utiliser<br /> <br />&nbsp; &nbsp; NSParameterAssert(rowIndex &gt;= 0 &amp;&amp; rowIndex &lt; [records count]);&nbsp; &nbsp; //c&#39;est une boucle pour remplir le tableau ?<br />&nbsp; &nbsp; theRecord = [records objectAtIndex:rowIndex];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; theValue = [theRecord objectForKey:[aTableColumn identifier]];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  //la je suis perdu,pourquoi utiliser des couples clé ?&nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; return theValue;<br />}
    

  • Philippe49Philippe49 Membre
    16:20 modifié #28
    Salut Ali !!

  • AliGatorAliGator Membre, Modérateur
    16:20 modifié #29
    Hey Philippe, le retour (épisodique?) :P

    prepa75 : je te conseille également de lire des bouquins genre "Cocoa par la pratique" (voire sa version originale en anglais).
    Bon si je te re-redirige vers encore des bouquins et de la lecture, c'est pas que je ne veuille pas te répondre, hein, mais c'est que c'est une question classique dans le genre.

    En fait ici le principe est que chaque colonne est identifiée par un "identifier" (qui n'est qu'une NSString arbitraire que tu attribues à  chacune de tes colonnes de ta tableview dans IB). C'est cet identifier qui va te permettre de savoir de quelle colonne il s'agit, et donc quelle valeur / quel objet retourner en conséquence dans cette méthode (en fonction de la ligne et de la colonne donc)

    Ensuite, pourquoi utiliser des couples de clés ? Bah ça c'est le principe du Key-Value Coding pour simplifier ton code : Voir l'exemple justement dans cette doc
  • prepa75prepa75 Membre
    16:20 modifié #30
    Non non je comprend tout à  fait que tu me redirige vers des livres,c'est la meilleure méthode pour progressé 
    je vais essayer de me procurer ce livre.

    l'exemple des children est tout à  fait clair,je commence à  comprendre...il me manquait cette étape là  en fait  :P

    merci bien.
  • Philippe49Philippe49 Membre
    16:20 modifié #31
    dans 1271145486:

    Hey Philippe, le retour (épisodique?) :P


    ... Un coup de nostalgie ...  8--) 8--)
    J'ai un petit peu de temps maintenant, mais je serais sans doute beaucoup moins investi.
    @+
Connectez-vous ou Inscrivez-vous pour répondre.