Je suis nouveau dans le fil, alors j'ai essayé avec cela pendant des heures (j'utilise XE4),
J'ai un fil simple p> Maintenant, sur ma forme principale, je veux appeler que "Proc" avec: p> mais chaque fois que j'essaye t compilé que je reçois: p> Il n'y a pas de version surchargée de 'synchroniser' qui peut être appelée
avec ces arguments p>
BlockQuote> Cela n'a pas de sens (pour moi) car lorsque je supprimai le paramètre "S" de "PROP", cela fonctionne bien. P> P>
3 Réponses :
Synchroniser ne prend qu'une procédure sans paramétrage, car je suis sûr que vous avez bien compris. Cela signifie que vous devez utiliser des propriétés que vous obtenez du fil principal afin de faire certaines choses avec elle. Par exemple, mon objet de thread est nommé moniteur: Alternativement, vous passez des messages sur le fil principal, mais ceci est un moyen rapide de la pincée pour le faire. P> p>
Regardez les différentes déclarations de c'est pourquoi en passant juste avec celui-ci, vous êtes complètement fort> abusant Cependant, car vous utilisez XE4, Mise à jour forte>: donnée de nouvelles informations sur ce que vous voulez vraiment faire avec votre fil, vous devez y aller comme ceci à la place: p> tthread.synchroniser () code>. Vous essayez d'appeler la version qui prend un tthreadmethod code> comme entrée. tthreadmethod code> est le paramètre moins: t.proc code> fonctionne mais qui passe t.proc (' foo ') code> ne le fait pas. p> tthread.synchroniser () code>. Vous n'avez pas besoin de créer un objet tthread code> afin d'utiliser la version statique de synchroniser () code>. Et si vous créez un objet tthread code>, faites-le faire quelque chose, comme ceci: p> Synchroniser () Code> prend également en charge également les procédures anonymes, ce qui éliminerait complètement votre classe tsendthread code> dans cet exemple, par exemple: p> type
TSendThread = class(TThread)
private
fURL, fMethod, fParam: string;
procedure GetValues;
protected
procedure Execute; override;
end;
procedure TSendThread.GetValues;
begin
fURL := ...;
fMethod := ...;
fParam := ...;
end;
procedure TSendThread.Execute;
begin
Synchronize(GetValues);
// use fURL, fMethod, and fParam as needed...
end;
procedure TForm1.Button1Click(Sender: TObject);
var
t : TSendThread;
begin
t := TSendThread.Create(False);
...
end;
Donc, un fil peut être utilisé sans le créer? Et comme je l'ai dit dans le commentaire ci-dessus, je veux envoyer ce "foo" de la touche1click, sans utiliser "Créer". cela peut être fait?
Non, j'ai dit synchroniser () code> peut être utilisé sans créer d'objet de thread. C'est parce que synchroniser () code> a plusieurs versions surchargées, dont plusieurs sont déclarées comme statique code>.
Une autre approche pourrait être d'écrire une fonction d'emballage qui ne prend aucun argument et appelle cette méthode sans paramétrage dans synchroniser () code>. p>.
Comme d'abord,
synchroniser code> est utilisé pour accéder à E.G. le fil principal d'un travailleur. N'appelez passynchroniser code> dans le fil principal.Eh bien, c'était le seul moyen que j'ai trouvé sur l'envoi de quelque chose à enfiler (sans utiliser la procédure Créer et sans la "SendMessage"), est-il de toute façon pour envoyer des valeurs à un thread et utiliser la valeur transmise?
Eh bien, c'est un sujet différent et assez complexe. Je suis sûr que si vous posez une question décrivant quelle Data i> vous souhaitez modifier dans votre fil de travail (en cours d'exécution?), Quelqu'un vous donnera une réponse complexe.
Eh bien, je viens d'essayer d'enfiler l'indy idhttp, je voulais envoyer aux paramètres de fil 3 (URL, get / post, lparam). Je pensais pouvoir faire avec juste appeler la méthode de synchronisation ...
@Tlama: Il est parfaitement sûr d'appeler
synchroniser () code> dans le fil principal. Il exécutera simplement la procédure spécifiée immédiatement. Ceci est utile pour le code qui ne sait pas s'il est appelé dans le fil principal ou sur un fil de travail.@Yassine_hell: Dans ce scénario, transmettez les valeurs au constructeur de thread et stockez-les dans des membres de la classe normale, puis accédez à eux dans
exécuté () code> au besoin. Vous n'avez pas besoin d'utilisersynchroniser () code> pour cela. Le seul but desynchroniser () code> est d'exécuter du code dans le fil principal. Si vous devez avoir un thread de travailleur, demandez au fil principal des données, vous pouvez utilisersynchroniser () code> pour cela, mais ce type de code est un peu différent de ce que vous avez présenté ici. Vous avez choisi un mauvais exemple à poser sur.@Yassine_Hell je présume comme une procédure régulière parm qui commence la fonction? Si tel est le cas, je peux mettre à jour ma réponse en conséquence.
@RemyleBeau appelant le constructeur réinitialiserait le fil entier?
@ GLENN1234 YEA, je pensais que vous pouviez simplement exécuter une procédure dans le fil comme dans une autre unité.
@Yassine_Hell: appeler le constructeur crée une nouvelle instance de thread, elle ne réinitialise pas un thread existant. Si vous souhaitez réutiliser la même instance de thread pour télécharger plusieurs fichiers, vous devrez mettre en place un système de file d'attente à l'intérieur du thread et disposera des demandes de fil de fil principal à la file d'attente, puis de la boucle de fil à travers la file d'attente, mettant lui-même mise à Dormez chaque fois que la file d'attente est vide et réveil lorsque la file d'attente a des demandes. Cela ne passe pas hors de portée de votre question initiale.
Oui, je suppose que je ne savais pas comment mettre ma question ... bien merci pour votre aide, j'ai une idée plus claire maintenant.
@Remy, l'avertissement dans le
synchroniser code> référence dit autre chose. Bien sûr, il s'applique dans certaines circonstances, mais je ne dirais pas parfaitement en sécurité. Je n'aime tout simplement pas le concept d'appel desynchroniser code> de l'extérieur même s'il serait absolument sûr.@TLAMA: Si vous faites référence à "Ne pas appeler Synchronisez de l'intérieur du fil principal. Cela peut provoquer une boucle infinie" Avertissement, la seule façon qui peut se produire est si la procédure synchronisée appelle
synchroniser () code > se synchroniser à nouveau, entraînant ainsi une boucle récursive. Mais la meilleure pratique consiste à coder les procédures synchronisées comme étant aussi petites et autonomes que possible pour éviter les conflits et les hits de performance. Il est donc très peu susceptible de rencontrer une procédure synchiée qui se synchronise.