f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
6 mai 2009 à 20:52
cs_paradise
Messages postés11Date d'inscriptionmercredi 7 mai 2003StatutMembreDernière intervention13 février 2012
-
13 févr. 2012 à 17:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_paradise
Messages postés11Date d'inscriptionmercredi 7 mai 2003StatutMembreDernière intervention13 février 2012 13 févr. 2012 à 17:06
+1 foxi
Code intéressant mais :
- petit souci de mise en forme du code (chacun sa sauce après tout)
- tous les "self." sont inutiles
- plus gênant les dossiers "prédéfinis" dans les options du projet, à virer avant de poster
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 10 mai 2009 à 16:51
>>Surcharge du thread :
obligée, Execute est abstract !
>>on copie ces variables depuis le composant
normalement, à la création du thread, il devrait y avoir une redirection des variables cruciales du composant vers le thread, c'est à dire que les *getters* et les *setters* devrait être :
function MyComponent.Getxxxx:TMyType;
begin
if System.Assigned(self.TheThread)
then Result := self.TheThread.xxxxx
else Result := self._xxxxx;
end;
En fait, seules les variables susceptibles d'être modifiées par le thread doivent être recopiées...
De plus, la gestion des TCanvas n'est possible qu'avec le méchanisme du Lock/Unlock, ce qui oblige Windows et les autres threads à ne pas modifier leurs adresses mémoires pendant que tu dessines dessus...
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 mai 2009 à 11:16
"un thread ne peut être correct si il modifie une variable d'un composant..."
C'est pourquoi l'on procède dans l'autre sens : on surcharge une version du TThread avec des variables dont on aura besoin, puis on copie ces variables depuis le composant.
C'est ça non ?
Cordialement, Bacterius !
nethacker
Messages postés288Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention12 octobre 2011 9 mai 2009 à 23:45
Merci beaucoup !
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 9 mai 2009 à 23:17
les composants sont accessibles via TForm.Components, sous la forme d'un TComponent...
Tu peux utiliser :
* self.Components[_each].InheritsFrom(TEdit)
* self.Components[_each] as TEdit
pour tester la classe du composant (ici TEdit), et pour ensuite le "typer"...
Dans ton exemple, mieux que *Sleep*, tu devrais te tourner vers le TTimer et son OnTimer (suffisant dans la plupart des cas) !
Mon exemple d'utiilisation avec les threads n'est pas pour simuler 100 TEdit qui font varier leurs contenus, mais plutôt pour manipuler un TBitmap, et son affichage depuis un Thread !
Plus tard, les même threads me seront utiles pour re-travailler des TBitmaps...
C'est délicat, en ce sens, que les threads ne paratgent pas le même espace mémoire que les composants de la VCL, et ne peuvent donc pas partager (ou seulement en lecture) leurs variables : un thread ne peut être correct si il modifie une variable d'un composant...
Pourtant, il faut pouvoir visuellemnt faire varier ses paramètres, comme le délai de rotation des lettres...
Dans le Execute du thread (PleaseDo dans mon exemple), je ne fais qu'un simple appel à Windows (via Invalidate), pour raffraîchir la TPaintBox qui lui est associée...
D'ailleurs, la version Codes-Sources de mon programme bogue si on utilise plusieurs PaintBox. Ceci est résolu en utilisant Canvas.Lock/Canvas.Unlock de la PaintBox, dans le PleaseDo...assurant ainsi le thread de ne pas "tomber" pendant un raffraichissement écran par Windows !
Je vais bientôt mettre les sources à jour... je suis en train de "disséquer" les lasses utilisées, pour en faire des génériques, voire des composants...
DH
nethacker
Messages postés288Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention12 octobre 2011 9 mai 2009 à 22:56
Je m'excuse pour avoir écrit trop de commentaires à la suite, mais comme je ne peux éditer ...
C'est vraiment bizarre parceque, je voulais faire exactement la même chose ce matin, à la manière d'un noob plusieurs Tedit et un autre pour entrer une chaîne et non un fichier comme votre source, ne connaissant pas les threads je procède lettre par lettre comme votre "write", finalement je me bloque là :
var
alphabet : string;
length,i,j : integer;
begin
i := 1;
j := 1;
alphabet := 'abcdefghijklmnopqrstuvwxyzZBCDEFGHIJKLMNOPQRSTUVWXYZ';
length := edit22.GetTextLen;
while ( i <= length) do begin
if copy(edit22.Text,i,1) <> copy(alphabet,j,1)
then begin inc(j); edit1.Text := copy(alphabet,j,1); edit1.Refresh; sleep(120); end
else begin inc(i); end;
end;
Je n'arrivais pas à passer au deuxième edit, impossible de faire un edit"i", pourtant c'est ce que je voulais faire, vous avez une idée ? du code on runtime ?
nethacker
Messages postés288Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention12 octobre 2011 9 mai 2009 à 22:49
Ah non c'est bon, apparemment c'est les fichiers de configuration, il voulait à tout prix créer le dcu dans ton bureau /David H.../
nethacker
Messages postés288Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention12 octobre 2011 9 mai 2009 à 22:37
J'arrive pas à compiler moi,j'ai Delphi 6, et il n'arrive pas à créer le dcu, si tu peux l'uploader sur ton serveur si t'en as ou quelque part ailleurs ça serait bien sympa.
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 8 mai 2009 à 15:02
grrrrrrrrrrrrrrr...Mais pas mon mot de passe !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 8 mai 2009 à 10:06
Oui c'est bon mon VIEUX PC (n'est pas un vieux PC, il a juste un ventilateur en moins, donc je dois baisser la vitesse du CPU à "basse" ou "moyenne" pour éviter qu'il s'éteigne, mais je vais le réparer dans le courant de la semaine prochaine) fonctionne maintenant :D plus de saccadé.
Cordialement, Bacterius !
PS : vire les fichiers inutiles, en particulier les fichier .dsk, .dof, .cfg. Ils enregistrent les options de Delphi (position de la fenêtre, répertoire de travail), et c'est avec cette gourde que je connais ton nom de famille ^^
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 7 mai 2009 à 22:29
>> Bactérius :
J'ai fait la correction pour ton vieux PC :
OnPaint se réfèrait au Canvas de la Form, et maintenant de la PaintBox... ainsi, il n'y a plus de saccadé !
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 7 mai 2009 à 20:03
>>Bactérius :
C pas normal....
Si tu rajoutes dans le FormCreate un doublebuffered = true ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 7 mai 2009 à 16:57
Windows XP SP 3 avec disque dur intégré de 34 Go partitionné en lecteurs C et D, un lecteur CD/DVD en E:\, un disque dur externe 250 Go en F:\, 512 Mb RAM, connexion internet, opéra, un ventilateur probablement pété et un CPU 1.70 GHz.
Quand je dis je rame, c'est-à-dire que par exemple lors de l'animation (telle qu'elle est paramétrée au lancement du programme), quand je veux changer la trackbar, son mouvement est "hachuré", saccadé, un peu comme si tu faisais un sleep(50) en boucle sans ProcessMessages ... je sais pas comment dire ...
Cordialement, Bacterius !
blueperfect
Messages postés234Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention21 novembre 2013 6 mai 2009 à 23:49
Ce n'est qu'un avant goût...
On peut en faire en HUD pour gameplay rapidement...
>>Bacterius
ça rame ?
T'as quelle config ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 6 mai 2009 à 21:35
Moi ça rame un peu chez moi ... mais c'est très intéressant !
Je vais m'y plonger dès que possible ...
13 févr. 2012 à 17:06
Code intéressant mais :
- petit souci de mise en forme du code (chacun sa sauce après tout)
- tous les "self." sont inutiles
- plus gênant les dossiers "prédéfinis" dans les options du projet, à virer avant de poster
10 mai 2009 à 16:51
obligée, Execute est abstract !
>>on copie ces variables depuis le composant
normalement, à la création du thread, il devrait y avoir une redirection des variables cruciales du composant vers le thread, c'est à dire que les *getters* et les *setters* devrait être :
function MyComponent.Getxxxx:TMyType;
begin
if System.Assigned(self.TheThread)
then Result := self.TheThread.xxxxx
else Result := self._xxxxx;
end;
En fait, seules les variables susceptibles d'être modifiées par le thread doivent être recopiées...
De plus, la gestion des TCanvas n'est possible qu'avec le méchanisme du Lock/Unlock, ce qui oblige Windows et les autres threads à ne pas modifier leurs adresses mémoires pendant que tu dessines dessus...
10 mai 2009 à 11:16
C'est pourquoi l'on procède dans l'autre sens : on surcharge une version du TThread avec des variables dont on aura besoin, puis on copie ces variables depuis le composant.
C'est ça non ?
Cordialement, Bacterius !
9 mai 2009 à 23:45
9 mai 2009 à 23:17
Tu peux utiliser :
* self.Components[_each].InheritsFrom(TEdit)
* self.Components[_each] as TEdit
pour tester la classe du composant (ici TEdit), et pour ensuite le "typer"...
Dans ton exemple, mieux que *Sleep*, tu devrais te tourner vers le TTimer et son OnTimer (suffisant dans la plupart des cas) !
Mon exemple d'utiilisation avec les threads n'est pas pour simuler 100 TEdit qui font varier leurs contenus, mais plutôt pour manipuler un TBitmap, et son affichage depuis un Thread !
Plus tard, les même threads me seront utiles pour re-travailler des TBitmaps...
C'est délicat, en ce sens, que les threads ne paratgent pas le même espace mémoire que les composants de la VCL, et ne peuvent donc pas partager (ou seulement en lecture) leurs variables : un thread ne peut être correct si il modifie une variable d'un composant...
Pourtant, il faut pouvoir visuellemnt faire varier ses paramètres, comme le délai de rotation des lettres...
Dans le Execute du thread (PleaseDo dans mon exemple), je ne fais qu'un simple appel à Windows (via Invalidate), pour raffraîchir la TPaintBox qui lui est associée...
D'ailleurs, la version Codes-Sources de mon programme bogue si on utilise plusieurs PaintBox. Ceci est résolu en utilisant Canvas.Lock/Canvas.Unlock de la PaintBox, dans le PleaseDo...assurant ainsi le thread de ne pas "tomber" pendant un raffraichissement écran par Windows !
Je vais bientôt mettre les sources à jour... je suis en train de "disséquer" les lasses utilisées, pour en faire des génériques, voire des composants...
DH
9 mai 2009 à 22:56
C'est vraiment bizarre parceque, je voulais faire exactement la même chose ce matin, à la manière d'un noob plusieurs Tedit et un autre pour entrer une chaîne et non un fichier comme votre source, ne connaissant pas les threads je procède lettre par lettre comme votre "write", finalement je me bloque là :
var
alphabet : string;
length,i,j : integer;
begin
i := 1;
j := 1;
alphabet := 'abcdefghijklmnopqrstuvwxyzZBCDEFGHIJKLMNOPQRSTUVWXYZ';
length := edit22.GetTextLen;
while ( i <= length) do begin
if copy(edit22.Text,i,1) <> copy(alphabet,j,1)
then begin inc(j); edit1.Text := copy(alphabet,j,1); edit1.Refresh; sleep(120); end
else begin inc(i); end;
end;
Je n'arrivais pas à passer au deuxième edit, impossible de faire un edit"i", pourtant c'est ce que je voulais faire, vous avez une idée ? du code on runtime ?
9 mai 2009 à 22:49
9 mai 2009 à 22:37
8 mai 2009 à 15:02
8 mai 2009 à 10:06
Cordialement, Bacterius !
PS : vire les fichiers inutiles, en particulier les fichier .dsk, .dof, .cfg. Ils enregistrent les options de Delphi (position de la fenêtre, répertoire de travail), et c'est avec cette gourde que je connais ton nom de famille ^^
7 mai 2009 à 22:29
J'ai fait la correction pour ton vieux PC :
OnPaint se réfèrait au Canvas de la Form, et maintenant de la PaintBox... ainsi, il n'y a plus de saccadé !
7 mai 2009 à 20:03
C pas normal....
Si tu rajoutes dans le FormCreate un doublebuffered = true ?
7 mai 2009 à 16:57
Quand je dis je rame, c'est-à-dire que par exemple lors de l'animation (telle qu'elle est paramétrée au lancement du programme), quand je veux changer la trackbar, son mouvement est "hachuré", saccadé, un peu comme si tu faisais un sleep(50) en boucle sans ProcessMessages ... je sais pas comment dire ...
Cordialement, Bacterius !
6 mai 2009 à 23:49
On peut en faire en HUD pour gameplay rapidement...
>>Bacterius
ça rame ?
T'as quelle config ?
6 mai 2009 à 21:35
Je vais m'y plonger dès que possible ...
Cordialement, Bacterius !