THREAD ET BITMAP (DESSIN AU CRAYON)

Signaler
Messages postés
152
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
29 avril 2009
-
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50482-thread-et-bitmap-dessin-au-crayon

Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
J'ai oublié une ligne plus haut:

procedure TForm1.FormClose;
begin
NeedUpdate:=False;
MyThread.Terminate;
Event.SetEvent;
MyThread.WaitFor;
FreeAndNil(MyThread);
end;
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
Pour mettre un thread en standby généralement on utilise un TEvent. Exemple "caricatural":

var
Event:TEvent;
NeedUpdate:Boolean;
MyThread:TMyThread;

procedure TForm1.FormCreate;
begin
Event:=TEvent.Create(nil,False,False,'');
MyThread:=TMyThread.Create;
end;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
NeedUpdate:=True;
Event.SetEvent;
end;

procedure TForm1.FormClose;
begin
NeedUpdate:=False;
Event.SetEvent;
MyThread.WaitFor;
FreeAndNil(MyThread);
end;

procedure TMyThread.Execute;
begin
while not Terminated do begin
Event.WaitFor(INFINITE);
if NeedUpdate then begin
NeedUpdate:=False;
ProcessData;
end;
end;
end;
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013

Bon, merci bien pour ces pistes mais une question me viens.

Dans mon cas, comment faire en sorte que le thread s'arrête et affiche le résultat OU annule le traitement et recommence avec de nouvelles valeurs. Dans mon cas, il tourne en boucle, mais est-il possible de mettre le thread en standby une fois terminé OU le forcé à s'arrêter pour le redémarrer tout de suite.

En clair, dans mon évenement OnChange de ma scollbar, il y a deux cas :
1 - mon thread est en plein calcul, il faut le stopper et le relancer
2 - mon thread est en standby, il faut juste le redémarrer

Autre question, si mon thread sort de la fonction Execute, il suffit de faire un RESUME pour relancer cette fonction ou il y a autre chose à faire...

Bien sur, en fonction de toutes ces réponses, je metterai en ligne la version modifier et "optimum"

Barbichette
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Salut,

Hélas, je n'ai pas le temps d'approfondir pour le moment. :s
Mais il me semble bien que si tu regardais vers l'événement OnTerminate du thread, tu y trouverais ton bonheur, Barbichette.

Je ferais une petite démo sur la synchro Thread-secondaire/Thread-principal et Thread-secondaire/thread-secondaire dès que j'aurais un peu plus de temps.
Le sujet est vaste. Et qu'il s'agisse de Canvas ou d'autre chose n'a pas beaucoup d'importance de toute façon.

Cirec et Forman ont raison : c'est un problème de Thread, pas de bitmap dans ton cas.
Lock/Unlock, c'est qu'une section critique et ça ne devrait être réservé qu'à la synchro de 2 Threads secondaires selon moi. Entre le Thread principal et 1 thread secondaire il faut faire plus simple. Et, de façon générale, la synchronisation n'a d'intérêt que quand il y a possibilité de conflit. Ce qui n'est pas le cas dans ton code à première vue.

Autre chose :
Forman écrit « si tu dessines un Bitmap qui est en train d'être modifié dans un autre thread, sans ces sections critiques tu vas afficher le bitmap qui est en cours de traitement, donc incomplet »

Mais c'est beaucoup plus grave que ça !
Imaginons le traitement suivant dans le 1er Thread :

If PixelColor <> 0 then begin
X := Y/PixelColor;
end;

Et dans le 2ème thread :
...
PixelColor := 0;
...

Dans le cas du multi-threading, il peut très bien arrivé que le Scheduler de Windows interrompe le 1er Thread entre la 1ère et la 2ème ligne... Puis donne la main au second Thread, et enfin revienne au 1er.
Là, c'est une belle division par zéro !
Et bonjour pour débuger ce genre d'erreur.
Donc, 'faut toujours prendre énormément de précautions avec les threads.

Encore autre chose :
le multi-threading, c'est bien pour simuler un semblant de pc multi-tâche. Mais, de nos jours, il y a de plus en plus de pc MultiCore. Il faut donc coder pour que, par exemple, ton traitement d'image se fasse sur un processeur dédié et ne pas laisser à la fantaisie de Windows de jongler avec tout ça.
Imagine ton application qui tourne sur un core et ton traitement d'image sur un autre. Là, ça devient un vrai traitement parallèle avec tous les bénéfices en terme de temps de traitement!
On se rapproche là du cerveau humain, de l'inconscient, etc...
'tain! Y'a encore de quoi faire, et j'ai l'impression que ma vie sera trop courte... :'(

Enfin, content d'avoir pu rencontrer mes bons amis ! :)))
Et j'espère pouvoir revenir bientôt sur ce site (s'il ne sombre pas dans la médiocrité de ceux qui n'y voient qu'un outil).
Afficher les 14 commentaires