質問

質問 私が求めていたもの 最も典型的なアンメットメディカルニーズを実践 使い方を個別のスレッドでデータを受信用IdTCPClientにインディ10.

背景: 以下のコードのログインidとパスワードに思い、実データに加工部品の削除機能再構成に成功しました。.の考え方のスレッドが受けるすべてのデータ(可変サイズのヘッダを宣言するのにメッセージの長さ)として構文解析でそのHandleData手続きは)とのトリガーイベントハンドラによってはコマンドです。

のTIdIOHandlerSocketに渡されるスレッドによりメインのアプリケーションにも書き込みデータのソケットとして、ときに必要です。

TScktReceiveThread = class(TThread)
  private
    { Private declarations }
    procedure HandleData;
  protected
    procedure Execute; override;
  public
    FSocket: TIdIOHandlerSocket;
    constructor Create(CreateSuspended: boolean);
  end;


procedure TScktReceiveThread.Execute;
var
  FixedHeader: TBytes;
begin
  Assert(FSocket <> nil, 'You must assign the connected socket to the receiving thread');
  SetLength(FixedHeader, 2);
   while not Terminated do
    begin
      if not FSocket.Connected then
        Suspend
      else
        begin
          FSocket.CheckForDataOnSource(10);
          if not FSocket.InputBufferIsEmpty then
           begin
            FSocket.ReadBytes(FixedHeader, SizeOf(FixedHeader), false);
            // Removed the rest of the reading and parsing code for clarity
            Synchronize(HandleData);
           end;
        end;
    end;
end;

接頭辞として使用している他のStackOverflowの問いにserverコンポーネントのインディ:"Delphiは、2009年インディ10日TIdTCPServer.OnExecuteのか、どのグラブのすべてのバイトのInputBuffer"を基本思います。

させます。

役に立ちましたか?

解決

いようにしたい場合オーバーヘッドの制作のスレッド授業各クライアント-サーバのデータを交換することができ、運動性を発揮ックに記載のとおり

http://delphidicas.blogspot.com/2008/08/anonymous-methods-when-should-they-be.html

私は同じような問題の数日前に私が書いた私のクラスTMotileThreadingる静的機能がん作のスレッド利用の新しい匿名の方法の特徴D2009.するとどうなるのかわかりません

type
  TExecuteFunc = reference to procedure;

  TMotileThreading = class
  public
    class procedure Execute (Func : TExecuteFunc);
    class procedure ExecuteThenCall (Func : TExecuteFunc; ThenFunc : TExecuteFunc);
  end;

第二の手続きを行うクライアント-サーバーコミュニケーションの場という場のデータが入荷しました。にフォーカスを匿名の方法が利用できる、ローカル変数の呼び出し側コンテキスト.で通信するとどうなるのかわかりません

var
  NewData  : String;
begin
  TMotileThreading.ExecuteThenCall (
    procedure
    begin
      NewData := IdTCPClient.IOHandler.Readln;
    end,
    procedure
    begin
      GUIUpdate (NewData);
    end);
 end;

プログラムの実行およびExecuteThenCallのメソッドは単に作業者のスレッドに設定FreeOnTerminateをtrueに簡素化とメモリ管理と実行を行う機能を提供したの労働者のスレッドの実行およびOnTerminate。

い役立っています。

編集 として求めの完全な実施のクラスTMotileThreading)

type
  TExecuteFunc = reference to procedure;

  TMotileThreading = class
  protected
    constructor Create;
  public
    class procedure Execute (Func : TExecuteFunc);
    class procedure ExecuteAndCall (Func : TExecuteFunc; OnTerminateFunc : TExecuteFunc;
                                SyncTerminateFunc : Boolean = False);
  end;

  TMotile = class (TThread)
  private
    ExecFunc             : TExecuteFunc;
    TerminateHandler     : TExecuteFunc;
    SyncTerminateHandler : Boolean;
  public
    constructor Create (Func : TExecuteFunc); overload;
    constructor Create (Func : TExecuteFunc; OnTerminateFunc : TExecuteFunc;
                        SyncTerminateFunc : Boolean); overload;
    procedure OnTerminateHandler (Sender : TObject);
    procedure Execute; override;
  end;

implementation

constructor TMotileThreading.Create;
begin
  Assert (False, 'Class TMotileThreading shouldn''t be used as an instance');
end;

class procedure TMotileThreading.Execute (Func : TExecuteFunc);
begin
  TMotile.Create (Func);
end;

class procedure TMotileThreading.ExecuteAndCall (Func : TExecuteFunc;
                                                 OnTerminateFunc : TExecuteFunc;
                                                 SyncTerminateFunc : Boolean = False);
begin
  TMotile.Create (Func, OnTerminateFunc, SyncTerminateFunc);
end;

constructor TMotile.Create (Func : TExecuteFunc);
begin
  inherited Create (True);
  ExecFunc := Func;
  TerminateHandler := nil;
  FreeOnTerminate := True;
  Resume;
end;

constructor TMotile.Create (Func : TExecuteFunc; OnTerminateFunc : TExecuteFunc;
                            SyncTerminateFunc : Boolean);
begin
  inherited Create (True);
  ExecFunc := Func;
  TerminateHandler := OnTerminateFunc;
  SyncTerminateHandler := SyncTerminateFunc;
  OnTerminate := OnTerminateHandler;
  FreeOnTerminate := True;
  Resume;
end;

procedure TMotile.Execute;
begin
  ExecFunc;
end;

procedure TMotile.OnTerminateHandler (Sender : TObject);
begin
  if Assigned (TerminateHandler) then
    if SyncTerminateHandler then
      Synchronize (procedure
                   begin
                     TerminateHandler;
                   end)
    else
      TerminateHandler;
end;

他のヒント

いにしました。インディは 目的 使用するというのに。使用す ブロックソケット, ので、 ReadBytes 通話な戻りまで読んをお楽しみいただけます。に対する非ブロックソケット、電話を返すことができ投票または通知非同期にかを判定するのに要請しています。

インディイへのソケットオブジェクトに独自のスレッド(または線維)が集まってできている。インディが付属 TIdAntifreeze 豚丼の専門店したいドラッグソケット部品の形状やデータモジュールのインディの部品からのGUIスレッドが、それだけではありません一般的に良くしておくとよいでしょう。回避できます。

ほかのスレッドできるものでなく FSocket ているなど、アドバイスをしていだだけを受ける価値のクラスのコンストラクタです。を主張するこのコンストラクタではない場合の、割り当てられます。さらに、この エラー をスレッドの非停止、なぜからの依頼であっても、オプションか?場合、スレッドが作成され、その走り出すか否かを確認 FSocket 割り当て、その作成のスレッドになっ割り当てる分野が成立いたします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top