2017-06-21 2 views
0

Sous FireMonkey, quand je veux exécuter du code après le « cycle » actuel, je fais comme ceci:Comment mettre en file d'attente du code à exécuter au prochain cycle sous firemonkey?

TThread.createAnonymousThread(
    procedure 
    begin 
    TThread.queue(nil, 
     procedure 
     begin 
     domycode 
     end); 
    end).start; 

parce que si nous sommes dans le mainThread, puis TThread.queue exécutera le code immédiatement. Je suis curieux de savoir si ce n'est pas une autre façon de le faire que d'utiliser un fil?

+0

Je pense que l'événement Application.OnIdle résoudrait cela, mais si votre code * peut * s'exécuter dans un thread d'arrière-plan sans problèmes, alors ce serait probablement préférable. – GolezTrol

+0

trop compliqué pour déplacer mon code en OnIdle :(je veux juste sortir du cycle de synchronisation en cours – loki

Répondre

4

Dans 10,2 Tokyo, une nouvelle méthode TThread.ForceQueue() a été ajouté pour répondre RSP-15427 (Ajouter une option pour laisser TThread.Queue() exécuter de manière asynchrone lorsqu'il est appelé par le thread principal de l'interface utilisateur):

TThread.ForceQueue(nil, 
    procedure 
    begin 
    domycode 
    end 
); 

Aucun fil est nécessaire . Avant de Tokyo, vous devez réécrire le code si vous ne souhaitez pas utiliser un thread anonyme pour appeler TThread.Queue(). Par exemple, vous pouvez publier un message différé avec PostMessage() ou PostThreadMessage(), puis effectuer le travail dans le gestionnaire de messages. Ou utilisez l'événement TApplication(Events).OnIdle, comme suggéré par GolezTrol.