0

スレッドを作成します

type 
  ss_thread = class;

  ss_thread = class(TThread)
  protected
    Fff_id : string;
    Fff_cmd : string;
    Fff_host : string;
    Fff_port : TIdPort;
    procedure Execute; override;
  public
    constructor Create(const ff_id, ff_cmd: string; ff_host: string; ff_port: TIdPort);
  end;

constructor ss_thread.Create(const ff_id, ff_cmd: string; ff_host: string; ff_port: TIdPort);
begin
  inherited Create(False);
  Fff_id   := ff_id;
  Fff_cmd  := ff_cmd;
  Fff_host := ff_host;
  Fff_port := ff_port;
end;

...
id := 123;
...

nst_ss_thread.Create(id, cmd, host, port);

そして何かをしている

procedure ss_thread.Execute;
var
  ws : TIdTCPClient;
  data : TIdBytes;
  i : integer;
  list : TList;
begin
      ws := TIdTCPClient.Create(nil);
      ws.Host := Fff_host;
      ws.Port := Fff_port;
....

id:=123 of thread を使用して別のスレッドを介してこのスレッド 'ws' 変数にアクセスする方法は?

ありがとう

4

2 に答える 2

3

できない。

ws内でローカル変数として宣言しましたss_thread.execute。つまり、そこでのみ表示されます。ss_thread.executeのほかの部分でも、外からは見えませんss_thread

他の場所やスレッドから表示したい場合は、より表示可能なスコープに移動する必要があります。たとえば、内の他の場所から表示したい場合は、またはセクションss_thread内のインターフェイス宣言に移動し、外部から表示したい場合は、またはセクションに移動します。privateprotectedss_threadpublishedpublic

于 2012-11-27T03:47:52.603 に答える
2

しないほうがいいです。スレッドオブジェクトは、その変数を他のスレッドから隔離するために正確に作成されます。
そうしないと、あらゆる種類のランダムな再現不可能なエラーが表示されます-http://en.wikipedia.org/wiki/Heisenbug

並列プログラミングでは、非常に明確な分離と絶縁が必要です。実行のタイミングと、どのステートメントが早く実行され、どのステートメントが後で実行されるかを予測することはできないためです。

その簡単なシナリオを想像してみてください。

  ws := TIdTCPClient.Create(nil);
  ws.Host := Fff_host;
      // at this point another thread gets access to ws variable, 
      // as You demanded - and changes it, so WS gets another value!
  ws.Port := Fff_port;

月に1回、高負荷のクライアントマルチプロセッサコンピュータでのみ発生する場合、このようなバグをどのように検出しますか?デバッグセッションまたはシミュレーション中のワークステーションでは、これは再現されません。どのようにそれをキャッチして修正しますか?

原則として、並列プログラミングを行う場合、データは「共有不変」と「プライベート可変」の部分に分割する必要があります。スレッド間通信を行う場合は、プロセス間通信と同様に、いくつかのイベント/メッセージキューを作成する必要があります。Windows GDIやMPIのように、スレッドとの間でコマンドと応答を渡します

次に、スレッドはキューから「change ws variable」コマンドをフェッチし、変更が許可された適切なタイミングで、内部から変更します。したがって、制御を想定し、変数がその時点でのみ変更されることを保証します。これにより、コードフローが損なわれることはありません。

OTLの例を読んで、オブジェクトに直接アクセスするより安全な方法でスレッド間通信がどのように行われるかを確認することをお勧めします。http://otl.17slon.com/tutorials.htm

于 2012-11-27T08:09:43.590 に答える