2009-11-25 8 views
2

Je crée un serveur qui démarre un thread (fil d'écoute). Ce thread écoute les connexions et fait ça. Finalement, il peut recevoir des données, que je veux passer au créateur du serveur:Contexte de thread sur Delphi

Mon programme -> Crée mon serveur -> Crée l'auditeur -> crée un thread pour chaque client

Maintenant, la question est: si j'attribue une propriété OnData = procedure (const Received: string) de l'objet; au serveur quand je le crée, et ensuite, cette même procédure est passée aux threads du client, donc quand le thread aura des données, il sera capable de les renvoyer au créateur du serveur. En pseudocode:

//My program 
MyServer:= TServer.Create(); 
MyServer.Ondata:= SomeProcedure; 

//The client thread 
//When data is received 
if (FServer <> nil) then 
    if Assigned(FServer.Ondata) then 
    Fserver.Ondata(ReceivedString).. 

Les questions ici sont:

1- Je comprends que si 10 threads exécutent cette procédure en même temps, la procédure sera exécuter dans le contexte de thread client, est donc la responsabilité de mon programme (le "propriétaire" réel de la procédure) pour synchroniser. Est-ce correct?

2- Si 10 threads différents exécutent la procédure, ai-je 10 "instances" de la procédure avec ses propres données en cours d'exécution en même temps?

3- Ai-je besoin de protéger l'objet OnData sur le serveur (par exemple, avec une section critique), ou de laisser la procédure "réelle"?

Répondre

3
  1. Oui. Lorsque le thread s'exécute, tout le code qu'il exécute est exécuté dans son propre contexte de thread, à moins que ce code n'ait été envoyé à un autre thread, par exemple avec la méthode Synchronize.

  2. Presque. Vous avez 10 instances de l'objet TThread, chacune avec ses propres données, exécutées en même temps. Il n'y a qu'une seule copie du code réel à la procédure, mais plusieurs objets de données peuvent l'utiliser à la fois. Tout code non thread-safe (qui peut accéder à la VCL, écrire des données partagées ou lire des données partagées auxquelles quelque chose d'autre pourrait écrire) doit être protégé.

Questions connexes