web-dev-qa-db-fra.com

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

Dans mon application multithread

J'utilise tthread.suspend et TTHead.Resume

Depuis le déplacement de mon application à Delphi 2010, je reçois le message suivant

[- AVERTISSEMENT DCC] XXX.PAS (277): W1000 Symbole 'CVAME' est obsolète

Si le CV est obsolète, ce qui devrait être utilisé en place?

Éditer 1:

J'utilise le CV Commande pour démarrer le thread - comme il est créé avec "Crééusompouveau" défini sur true et suspendre Avant de mettre fin au fil.

Edit 2:

Voici un lien le manuel Delphi 201

35
Charles Faiga

Charles Si vous lisez le code de la classe Tthread, trouvez-vous la réponse.

   TThread = class  
   private type  

..
..
..   
   public  
     constructor Create(CreateSuspended: Boolean);  
     destructor Destroy; override;  
     procedure AfterConstruction; override;  
     // This function is not intended to be used for thread synchronization.  
     procedure Resume; deprecated;  
     // Use Start after creating a suspended thread.  
     procedure Start;  
     // This function is not intended to be used for thread synchronization.  
     procedure Suspend; deprecated;  
     procedure Terminate;  

Voir ce lien http://wings-of-wind.com/2009/08/28/rad-studio-2010-community-pulse-theday-aditation-part-2/

Edit:

Si vous devez synchroniser des threads, vous pouvez utiliser un schéma basé sur des sections Tmutex, Tevent et critiques.

Au revoir.

28
RRUZ

Utiliser tthread.start au lieu de .Resume

--Edit-- Démarrer peut bien sûr seulement être utilisé avec Delphi 2010 (puis, vraisemblablement) pour démarrer un fil créé en suspension (où vous auriez utilisé le CV précédent).

L'utilisation de CV/Suspend (ou des fonctions Winapi correspondantes) pour la synchronisation de thread n'est pas recommandée. Voir la discussion ici (regardez les commentaires de Barry Kelly).

13
PhiS

suspendre et reprend étaient (ou étaient-ils utilisés) potentiellement cassé dans le Classe TTHead (Si vous regardez la source, vous verrez que la méthode de suspension est directement et inconditionnelle définit un booléen à un fil de fil indiqué à l'état suspendu plutôt que de dérivation plus robuste Cet état de l'exécution comptez sur la poignée de thread. Ironiquement le CV La méthode utilise cet indicateur plus robuste sur Mise à jour l'état suspendu booléen).

C'est peut-être pourquoi ils ont été obsolètes. C'est aussi pourquoi j'ai mis en œuvre ma propre classe pour encapsuler un thread Windows avec une suspension plus robuste et un mécanisme de reprise plus robuste ainsi que la capacité de redémarrer un fil une fois avait terminé.

Je ne sais pas pourquoi leur dépréciation est censée être liée à la synchronisation. La suspension et la reprise des threads ne sont pas nécessairement liées à la synchronisation, bien que je puisse voir comment cela pourrait être. Il est intéressant de noter que les méthodes équivalentes dans la classe de threads .NET Framework sont similaires comme obsolètes. Et les mêmes commentaires w.r.t Synchronisation apparaissent dans la documentation de l'API Windows pour la suspension/reprise du fil.

Si vous utilisez des méthodes obsolètes vous rend nerveux et que vous souhaitez toujours suspendre/reprendre, vous pouvez toujours utiliser l'API Windows pour suspendre et reprendre le fil en vous référant à sa poignée .

7
Deltics

Juste au cas où tout ce que vous vouliez faire, c'était vous débarrasser des indices du compilateur

(1) se débarrasser de l'indice de compilateur quand Démarrer un fil ...

remplacer

MyThread := TMyThread.Create(True);
MyThread.Resume;

avec

MyThread := TMyThread.Create(True);
MyThread.Start;

(2) se débarrasser de l'indice de compilateur quand Arrêter un fil ...

remplacer

MyThread.Suspend;
MyThread.Terminate;

avec

MyThread.Terminate;

Pas un gros problème du tout. Faîtes attention à tentative d'obscurcissement.

5
Sam

Le code de contrôle du comportement du fil doit être rempli dans une procédure de thread. Utilisez des objets de synchronisation appropriés et des appels d'API correspondants afin de suspendre/reprendre l'exécution du fil. Le faire de l'extérieur est une pratique dangereuse. Il y avait donc une décision de le décrocher.

4
Andrej Kirejeŭ

Utilisation

Suspended := False; // Resume;

ou

Start;
3
Ilya

Vous devriez créer le fil comme suit:

constructor TSignalThread.Create;
begin
 // create event handle first!
  FEventHandle := CreateEvent(
          {security}      nil,
          {bManualReset}  true,
          {bInitialState} false,
          {name}          nil);
  FWaitTime := 10;
  inherited Create({CreateSuspended}false);
end;

De cette façon, un appel à démarrer n'est pas requis.

Voir http://www.gerixsoft.com/blog/delphi/creatier-threads Pour une explication Pourquoi ce code fonctionne.

3
Andriy Gerasika

@gghie (un peu de retard, je sais)

prenons par exemple madexcept et similaire. Si votre application se bloque et qu'un rapport de bogue est montré à l'utilisateur, cela signifie que la boîte de dialogue attend l'entrée d'utilisation. Si cela se produit, le crash résulte d'une action de thread (pas nécessairement un fil de fil), si vous ne suspendez pas les threads, l'écran sera rempli de dialogues de rapport de bogues.

exemple 2: Logging. Pour une raison particulière, j'ai au moins eu la nécessité de connecter un état d'exécution des threads. Cela inclut la trace de pile actuelle. Maintenant, comme vous (devrait) savoir, vous ne pouvez pas le faire pendant que le thread est en cours d'exécution car pendant le temps que vous collectez des informations à ce sujet, les threads conservent de faire des trucs afin de terminer la collecte, les informations collectées ne seront pas cohérentes. Par conséquent, vous devez suspendre le fil.

Et je peux continuer avec des exemples pratiques sur la gestion du fil. Certes, ce ne sont pas des choses que vous faites dans la programmation quotidienne, mais au moins le premier exemple que je suis sûr que beaucoup d'entre vous utilisez, même si vous n'êtes pas au courant des internes de celui-ci. Det de dérivage? Encore une fois, vous les utilisez. Mais en effet, dans tous ces cas, Tthread n'est pas utilisé, car le travail est effectué sur des poignées de thread. Donc, en effet, un exemple valide de l'utilisation de la suspension Tthread est difficile à venir. Mais des threads en général, c'est une autre histoire.

2
ciuly