Besoin aide sur les thread

Soyez le premier à donner votre avis sur cette source.

Vue 2 718 fois - Téléchargée 697 fois

Description

ATTENTION, ceci n'est pas forcement un bon exemple, mais un appel à l'aide...
J'ai un petit besoin d'aide avec ces pu... de thread...
J'essaye de reprendre mon précédent interpréteur pour l'insérer dans un thread, pour un fonctionnement en parallèle de ma fenêtre principale.
Avec un script portant sur des textes à afficher dans un mémo, OK
Avec un script pour dessiner dans un TImage, plus rien ne va plus...

Dans l'exemple mis ici (et j'en profite pour rappeler le fonctionnement), mon interpréteur exécute le script, puis lorsqu'une fonction de dessin est interprétée, il fait un appel à la fonction "FunctionCall" pour que le dessin en question soit fait sur un TImage sur ma fenêtre principale.
J'ai essayé de blinder un peu le truc avec des sections critiques pour que le Timage ne reçoive pas deux demandes en même temps. Mais rien n'y fait, le dessin ne se fait pas, ou pas entièrement. Et il n'est pas persistent dans le canvas du TImage (Un simple Repaint, est l'image s'en va...)

Est-ce que quelqu'un à une explication (ou une solution) à ce problème.
Que faut-il faire à un TCanvas pour qu'il marche d'un Thread à l'autre. (un bon coups de pied ???)

Merci d'avance

PS : je ne pose pas la question directement dans le forum car le code est long...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
220
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013

j'ai mis en ligne la version qui marche.
En fait, il y avait, il me semble, un problème entre Timage qui est un composant non fenêtre (sans hwnd), son canvas et les threads.

Merci à tous...
Messages postés
220
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013

Bon, j'ai trouvé une piste :

dans ma fonction de tracé, je laisse tomber les sections critiques, j'encadre les tracés d'un lock/unlock.
Puis, j'envoie un message à la fenêtre pour rafraichir le timage (et le reste).

procedure TFMain.FunctionCall(...
[...]
begin
Env:=TEnvironnement(sender);

image1.Canvas.lock;

case index of
[...]
end;
image1.Canvas.Unlock;
sendmessage(fmain.Handle,WM_PAINT,0,0);
end;

Je teste encore des choses pour voir...
Messages postés
220
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013

@Manchester : oui, mon canvas existe. j'ai essayé de dessiner directement dans le canvas de l'écran avec getdc(0) et bitblt, idem.

@IA93 : la modif ne marche pas chez moi...
Par contre, avec un sleep(10) au début de ma fonction de dessin, le tracé est long mais ça marche mieux...
Le tracé ne s'effectue pas dans le bitmap de image1, mais il apparait au moins à l'écran...

Je continue de chercher une explication...
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021

Barbichette

tu a tester

un if assigned(montruc.canvas) then
faitceci
else
signale_une_grosse_erreur; ?

Bon Coding...

ManChesTer.
Messages postés
3
Date d'inscription
vendredi 17 octobre 2003
Statut
Membre
Dernière intervention
26 mars 2008

Bonsoir,
Lorsque j'ai voulu compiler le source tel qu'il est à l'origine, j'ai eu une suite d'erreurs car je n'ai que Delphi6-Pro.
Le problème venait des appels à TFormatSettings. j'ai donc cherché à recréer un équivalant à partir d'une documentation.
Et j'ai trouvé entre autre la page suivante:
http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TFormatSettings

Il y est dit que le contexte n'est peut-être pas toujours SAFE-THREAD !

( C'est peut-être une explication car avec les modifications proposées, mon programme fonctionne sans problème...)

Voici donc ma version D6 de UValues.pas, avec ses suppressions, ou la réécriture de GetNumberValue.

unit UValues;

{-----------------------------}
type
TValue=class
//FFormatSettings:TFormatSettings;

{-----------------------------}
constructor TValue.create;
begin
//GetLocaleFormatSettings(0,FFormatSettings);
//FFormatSettings.DecimalSeparator:='.';

{-----------------------------}
function TValue.GetNumberValue:extended;
var
i, p :integer;
LString : string;
begin
LString:=FString;
result:=-1;
for p:=1 to length(LString) do
if LString[p]='.' then LString[p]:=',';
case FTypevalue of
TypeNone:result:=0;
TypeNumber:result:=FNumber;
TypeString:
begin
try
result:=strtoint(LString);
except
try
result:=strtofloat(LString);
except
SendExcep(format('impossible de convertir "%s" en nombre', [FString]));
end;
end;
end;
TypeBoolean:if FBoolean then result:=1 else result:=0;
TypeArray:result:=Fcount;
end;
end;

{-----------------------------}
procedure TValue.SetNumberValue(v:extended);

//TypeNumber:result:=floattostr(FNumber,FFormatSettings);
TypeNumber:result:=floattostr(FNumber);

{-----------------------------}

( J'ai envoyé une autre version modifiée dans un mail à BarbichetteWorld...)

IA93.
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.