Thread-safe en delphi
J'ai modifier et changer certains composants visuels dans un thread et comme vous le savez, il n'est pas sûr de le faire.
Ma question est comment écrire un complètement thread-safe code? Il est possible? si elle est alors pouvez-vous me donner un exemple simple?
mon code qui n'est pas thread-safe:
type
tMyWorkerThread = class(TThread)
public
procedure Execute; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure tMyWorkerThread.Execute;
begin
//codes
//working with visual components
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyWorkerThread.Create(false);
end;
Merci.
- jetez un oeil à Synchroniser
- Utiliser le
File->New->Other
menu, choisissezDelphi Projects->Delphi Files->Thread Object
, et de lire l'énorme commentaire en haut de la nouvelle unité qu'il crée. - J'ai modifier et changer certains composant virtuel Virtuel composant ou composant visuel ? Et ce genre de mise à jour ? la barre de progression peut facilement être fait à partir de thread principal, tandis que travailleur trreads serait seulement de faire rapport de leur travail qui est fait en quelques lignes de code
- double possible de une mise à Jour de composants VCL de CreateAnonymousThread
Vous devez vous connecter pour publier un commentaire.
L'écriture d'un thread-safe code en Delphi consiste à les soins de base que vous auriez dans une autre langue, ce qui signifie de traiter avec conditions de course. Une condition de concurrence se produit lorsque les différents threads d'accéder à la mêmes données. Un bon moyen pour s'en sortir est de déclarer une instance de TCriticalSection et envelopper le dangereux code.
Le code ci-dessous montre un getter et un setter de la propriété qui, par hypotesis, a une condition de course.
Avis l'utilisation d'une seule instance de TCriticalSection (CriticalX) pour sérialiser l'accès à la donnée membre FX.
Cependant, avec Delphi vous avez un supplément de considération! VCL est pas thread-safe, afin d'éviter d'VCL des conditions de course, à toute opération dont le résultat est en écran de modification de doit s'exécuter dans le thread principal. Vous obtenez en appelant l'un de ces codes à l'intérieur d'un Synchroniser méthode. Compte tenu de la classe ci-dessus, vous devriez faire quelque chose comme ceci:
Si vous avez Delphi 2010 ou tard, il y a un moyen plus simple qui rend l'utilisation de méthodes anonymes:
J'espère que cela aide!
Vous ne devriez accès VCL objets à partir des principaux VCL fil.
Certaines méthodes de lecture (propriété des getters) fonctionnent à partir d'autres threads dans la pratique, mais vous devez le prouver à l'avance de la lecture VCL sources pour le Delphi construire. Ou ne pas l'utiliser.
PS: Synchroniser méthode s'exécute procédure donnée dans les principales VCL fil, d'interrompre le thread appelant, ce qui peut conduire à un blocage, si le thread principal a également été bloqué.
Lire la suite: (en fait de faire cette réponse à la liste de quelques liens)
Mon problème résolu avec la
Synchronize!
Merci à vous tous pour m'aider.