5

現在、Delphi で電子メールを送信するために Ararat Synapse をテストしています。

ローカル関数は TSMTPSend を作成し、電子メールを送信します。
この操作を中止するにはどうすればよいですか? SMTP.Sock.OnStatus に割り当てられたコールバック関数を設定して、ステータス出力を実行しました。
送信の進行を中止したい場合、コールバック関数内で TSMTPSend の TTCPBlockSocket を使用できると考えました。この関数では TSMTPSend に直接アクセスできないためです。

私がやりたかったことは基本的に次のように見えます

MyCallBack(Sender: TObject; Reason: THookSocketReason; const Value: string);
begin
  if FCancelWasClicked then
  begin
    if Sender is TTCPBlockSocket then
      TTCPBlockSocket(Sender).StopFlag := True;
      // or TTCPBlockSocket(Sender).AbortSocket or CloseSocket
  end;
end;

しかし、StopFlag は効果を示さず、AbortSocket/CloseSocket は StackOverFlow につながります。これは、ソケットが HR_CloseSocket メッセージを無限にポンピングするためです。

私はそれを間違っていますか?他のオプションはありますか?

4

1 に答える 1

6

Synapse は、キャンセル動作の実装を可能にするハートビート関数を提供します。

http://www.ararat.cz/synapse/doku.php/public:howto:heartbeat

OnHeartbeat イベントを処理し、HeartbeatRate プロパティをハートビート間の間隔に設定し、StopFlag を設定して操作をキャンセルします。

于 2013-02-20T11:50:56.733 に答える