begin process at 2013 05 21 09:41:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > BESOIN AIDE SUR LES THREAD

BESOIN AIDE SUR LES THREAD


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Classé sous :thread, aide, tcanvas, section critique Niveau :Expert Date de création :09/06/2012 Date de mise à jour :15/06/2012 19:05:37 Vu / téléchargé :1 470 / 94

Auteur : barbichette

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 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...



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

15 juin 2012 19:05:40 :
voilà une version qui marche...

 Sources du même auteur

Source avec Zip Source avec une capture SEAM CARVING V2
Source avec Zip Source avec une capture SEAM CARVING
Source avec Zip Source avec une capture DÉFORMATION D'UN VISAGE
Source avec Zip COMPTER LES COULEURS D'UNE IMAGE
Source avec Zip Source avec une capture DESKTOP EN SABLE

 Sources de la même categorie

Source avec Zip Source avec une capture SEAM CARVING V2 par barbichette
Source avec Zip Source avec une capture SEAM CARVING par barbichette
Source avec Zip Source avec une capture EFFET MATRIX DANS UN PANEL par soldier8514
Source avec Zip Source avec une capture REDIMENSIONNEMENT XBR AVEC DES FACTEURS D'ÉCHELLE QUELCONQUE... par pseudo3
Source avec Zip Source avec une capture DÉFORMATION D'UN VISAGE par barbichette

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SEAM CARVING V2 par barbichette
Source avec Zip Source avec une capture BILLARD FLIPPER par Toidil
Source avec Zip Source avec une capture CLAVIER ARRANGEUR MIDI VIRTUEL par etirex
SYNCHRONISATION DE THREADS DANS DES DLL par saib
Source avec Zip Source avec une capture THREAD ET BITMAP (DESSIN AU CRAYON) par barbichette

Commentaires et avis

Commentaire de Caribensila le 09/06/2012 19:23:02

Salut Barbichette,

Je n'ai pas encore regardé ton code mais, perso, quand j'utilise TCanvas dans une application multithread, j'utilise souvent les méthodes Lock/UnLock de TCanvas.
Je trouve que c'est moins problématique que les sections critiques.

En espérant que ça t'aidera...

Commentaire de barbichette le 09/06/2012 20:29:03

déjà essayé...
C'est la même chose, d'ailleurs, lock/unlock fait simplement intervenir un section critique.

Non, il me semble que le problème vient plutôt de la gestion des canvas, handle, HDC et autres.

Merci

Commentaire de Jean_Jean le 09/06/2012 23:32:16

Salut barbichette
  et Cari au passage, ça faisait un bail hein?

  Peut-être devrait-tu passer par un Bitmap intermédiaire dans lequel tu dessines ou même un TPaintBox. Comme ça, ça sera plus facile à maintenir l'image...L'avantage d'avoir un Bitmap, c'est qu'il sera plus facile de gérer en transparence au code l'artillerie du HDC etc.

Mais bon, c'est une idée! faut tester...

Sinon, j'ai pas encore abordé la question des sections critiques chez les threads... J'en suis encore au début...

Bien à toi

Commentaire de cirec le 10/06/2012 00:42:58 administrateur CS

Salut,

Jean_Jean et Caribensila ont raison à eux deux.

en effet, il faut utiliser un BMP intermédiaire (tampon) et utiliser Lock/UnLock ... avec cette méthode on peut se passer de faire appel à Synchronize.
j'ai pas regardé le code (j'ai pas accès à Delphi en ce moment).

Commentaire de ManChesTer le 13/06/2012 19:57:21 administrateur CS

Salut,

J'utilise le multithread pour certains affichages le bitmap intermédiaire est une bonne solution
Mais personnellement j'utilise le scanline et les apis windows directement et je n'ai jamais rencontré de problèmes.


procedure Mathread.bmptopanel(pan:tpanel;var bmp:tbitmap);
var dc:hdc;
begin
//travail du bmp sur scanline ou api windows...
dc:=getdc(pan.Handle);
bitblt(dc,0,0,pan.width,pan.height,bmp.Canvas.Handle,0,0,srccopy);
releasedc(pan.Handle,dc);
end;

pan et bmp sont dans public de la définition du thread.

Bon Coding,

ManChesTer.

Commentaire de IA93 le 14/06/2012 16:36:44

Je suggère les modifications minimales suivantes:
-Ajouter un destructor au ThReadRun
-Supprimer toutes les instructions de synchronisation/section critiques car il n'y a qu'un seul thread.
-Lancer le thread par Execute, puis le détruire pour terminer

A chaque clic du Bouton1, le thread et l'interpréteur sont créés, puis détruits à la fin de l'appel. Donc l'exécution du mémo est dynamique...(on peut modifier le mémo!)

Voici la liste des modifications proposées:

unit UMain;

// Liste des modif à effectuer sur UMain.pas //

{---------------------------------------}
TThreadRun=class(tthread)
   private
//    FLock: TCriticalSection;
   protected
    constructor Create;
    destructor Destroy;
    procedure Execute; override;
  end;

{---------------------------------------}
var // Global
//  FSection: TRTLCriticalSection;

{---------------------------------------}
destructor TThreadRun.Destroy;
begin
  inherited Destroy;
end;

{---------------------------------------}
procedure TThreadRun.Execute;
begin
try
  t.Run(-1);
except
  on E: Exception do FMain.ErreurInterpret;
end;
FMain.FinishInterpret;
end;

{---------------------------------------}
procedure TFMain.FunctionCall(...);

// EnterCriticalSection(FSection);

// LeaveCriticalSection(FSection);

{---------------------------------------}
procedure TFMain.FormCreate(Sender: TObject);

//InitializeCriticalSection(FSection);

{---------------------------------------}
procedure TFMain.Button1Click(Sender: TObject)

// th.Resume;
th.Execute;
th.Terminate;
th.destroy;

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

Commentaire de barbichette le 14/06/2012 22:24:02

Merci pour ces réponses.
Malheureusement, rien n'y fait...
Je n'y comprend plus rien.
Ca a l'air tellement simple et pourtant, ça ne marche pas.
En fait, il me semble que je dessin dans un canvas qui n'existe plus au moment où je l'appel...

@ManChesTer : j'ai regardé justement ta source avec le thread qui dessin en texte (qui, lui, marche bien), mais je ne vois vraiment pas pourquoi mes essais ne marchent jamais...

Sniff....

Commentaire de IA93 le 14/06/2012 23:28:17

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.


Commentaire de ManChesTer le 15/06/2012 00:26:48 administrateur CS

Barbichette

tu a tester

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

Bon Coding...

ManChesTer.



Commentaire de barbichette le 15/06/2012 18:06:19

@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...

Commentaire de barbichette le 15/06/2012 18:25:24

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...

Commentaire de barbichette le 15/06/2012 19:08:00

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...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Urgent, cherche aide sur le multi-thread [ par djtexas ] Pour commencer, j'ai programmé un serveur chat sans grande prétention, mais me voila confronté a un problème de stabilité du moteur. J'utilise 2 compo A l'aide SVP [ par ludopika ] Bonjour,J'ai un traitement sur un fichier qui contient 500000 lignes.J'aimerai faire ce traitement dans un thread car en fait j'ai50 traitement à fair Besoin d'aide Thread!! [ par LeTchEn ] Salut,je doit bosser sur les compo indy et particulierement idTCPClient et idTCPServer!faudrait que je puisse communiquer en envoyant des données Aide sur thread et connexion tIdTCPClient et tIdTCPServer de indy [ par cybersky ] Bonsoir comment faire pour que plusieurs clients ce connecte sur un seul serveur et que chaque client puisse voir le contenu des fichiers patager d'un S'abonner à un événement (besoin d'aide) [ par CDEProgrammeur ] Bonjour, J'aimerais m'abonner à l'évnement « OnTerminate » d'un thread qui est de type TNotifyEvent. J'ai essayé différentes méthodes mais ma procedu problème de Thread [ par Jean_Jean ] [^^clinoeil1]Bonjour les Delphistes, J'ai un souci dans un Thread. Je souhaite réaliser une série de voyants clignotants dans un Thread dans lequel While Not EOF(F) dans Thread [ par Jean_Jean ] Bonjour J'ai un souci avec la détection d'une Fin de lecture de fichier dans un Thread: 1. Code qui marche : Je détecte la Fin du parcours de F Utilisation de Nirva à l'aide d'un Web Service (WSDL) [ par vero70 ] Est-ce que quelqu'un peu me dire si Nirva supporte Delphi? J'ai pu importer l'objet Nirva WSDL qui a été adapté au langage Delphi mais je n'arrive pas paintbox [ par fodhel ] salut tout le monde voila je veut crée un splash pour mon application et j'ai des difficulté a trouver le composant TPaintBox une petite aide ou orie Application [ par Bokar01 ] bonjour je vient par la pressente demandé de l'aide sur je peut avoir un exemple d'application avec sa base de donnée et le code source développé avec


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,139 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales