9
votes

Quelle est la bonne façon de démarrer un fil suspendu dans Delphi 2007?

Dans Delphi XE, je peux utiliser la procédure de démarrage, mais cette méthode n'existe pas dans Delphi 2007.

Cet exemple de code fonctionne correctement dans Delphi Xe, à l'aide du démarrage p>

MyThread:=TMyThread.Create(True);
MyThread.FreeOnTerminate    :=True;
MyThread.Property1:=900;
MyThread.Property2:=2;
MyThread.Resume;


0 commentaires

5 Réponses :


1
votes

Oui, c'est la bonne façon pour les anciennes versions Delphes anciennes qui n'ont pas de Démarrer Procédure.


0 commentaires

1
votes

CV et suspension sont obsolètes dans Delphi 2010 et versions plus récentes. Semble qu'il est essentiellement de décourager les utiliser pour la synchronisation de fil. Ils ne sont pas destinés à cela.

Quoi qu'il en soit, si tout ce que vous voulez faire est de reprendre un thread créé suspendu, appelez CV dans les versions plus anciennes est en sécurité.

Si vous devez utiliser le même code source dans Delphi 2007 et Delphi Xe, vous pouvez utiliser la compilation conditionnelle pour éviter tout avertissement dans XE.

Aussi, jetez un coup d'œil à cette question qui est liée à votre question:

Tthread.Resume est obsolète à Delphi-2010 ce qui devrait être utilisé en place?


0 commentaires

22
votes

La bonne façon de démarrer un thread suspendu est de ne jamais avoir de fil suspendu en premier lieu.

Il y a un meilleur moyen de créer des threads. Si l'appelant doit em> fournir une valeur à l'objet pour que la classe fonctionne correctement, ne le rendez pas facultatif: exigez-le comme paramètre au constructeur. Et s'il n'y a qu'une seule valeur valide pour ce paramètre, alors ne vous en faites même pas un paramètre: il suffit de coder de manière difficile dans le constructeur. (Combien de fois avez-vous écrit une classe de thread qui que parfois em> devrait se libérer de la résiliation? Je n'ai jamais vu cela.) P>

MyThread := TMyThread.Create(900, 2);


1 commentaires

Merci pour les informations ajoutées sur l'ordre de création et d'exécution. J'ai toujours commencé à suspendre les threads et je les ai repris avec cette peur exacte.



0
votes

Vous ne devez jamais appeler la suspension sur une Tthread, il n'est pas sûr de le faire et de reprendre ne doit être utilisé que pour démarrer un fil créé en suspension.

Dans Delphi 2010, la suspension et le reprend là où l'amortissement et la méthode commencent ont été introduits pour renforcer cela.

Pour une explication plus complète, voir cette thread aux forums de CodeGears.


0 commentaires

5
votes

Il n'y a rien de mal à appeler CV sur un fil créé avec le paramètre CreateSuspendé défini sur true dans le constructeur. (Pourquoi d'autre y aurait-il un paramètre CreateSuspendu après tout?)

Cependant, les problèmes réels se trouvent lorsque vous suspendez / reprend un thread exécutant . Cela est principalement dû à des références à des ressources ouvertes, telles que les objets COM. (Par exemple, si vous avez un objet de connexion ADO actif et une requête en cours d'exécution ... Il n'est pas très idéal de suspendre ce fil et d'essayer de le reprendre plus tard ... Il est évident que cela ne va pas toujours travailler bien pour vous ou la connexion de base de données dans ce scénario.)

Si vous faites attention à vos références externes, la suspension / reprise d'un thread de course devient beaucoup plus sûre, à l'exception des conditions de course possibles pouvant atteindre ... mais ce sont des réponses pour de nombreuses autres questions ...


1 commentaires

Ou en général, toute instance lorsque vous envoyez une sorte de demande et attendez une sorte de réponse.