Delphi上的线程上下文

时间:2009-11-25 13:18:14

标签: multithreading delphi

我正在创建一个启动线程的服务器(监听线程)。这个线程监听连接并做它的事情。最终它可能会收到一些我希望传递给服务器创建者的数据:

我的节目 - >创建我的服务器 - >创建监听器 - >为每个客户端创建一个线程

现在的问题是:如果我赋予对象属性OnData = procedure(const Received:string);当我创建它时到服务器,然后,这个相同的过程被传递给客户端线程,所以当线程获得一些数据时,它将能够将它传递回服务器的创建者。在伪代码中:

//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)..

这里的问题是:

1-我理解如果10个线程同时执行此过程,则该过程将在客户端线程上下文中执行,因此我的程序(该过程的实际“所有者”)有责任进行同步。是对的吗?

2-如果10个不同的线程执行该过程,我是否有10个“实例”的过程,同时它自己的数据在运行?

3-我是否也需要保护Server对象上的OnData(例如,使用关键部分),或者可以将其保留为“实际”程序?

1 个答案:

答案 0 :(得分:3)

  1. 是。当线程运行时,它运行的所有代码都在其自己的线程上下文中执行,除非该代码已经发送到另一个线程,例如使用Synchronize方法。

  2. 几乎。您有10个TThread对象实例,每个实例都有自己的数据,同时运行。该过程的实际代码只有一个副本,但多个数据对象可以一次使用它。

  3. 任何非线程安全的代码(可能访问VCL,或者写入任何共享数据,或从其他人可能写入的共享数据中读取)都需要受到保护。