35

私のマルチスレッドアプリケーションでは

TThread.suspendTThread.resumeを使用しています

アプリケーションをDelphi2010に移動してから、次の警告メッセージが表示されます

[DCC警告]xxx.pas(277):W1000シンボル「再開」は非推奨になりました

Resumeが非推奨になった場合、その場で何を使用する必要がありますか?

編集1:

Resumeコマンドを使用してスレッドを開始します-スレッドを終了する前に、「CreateSuspended」をTrueに設定して作成し、一時停止するためです。

編集2:

これがdelphi2010マニュアルのリンクです

4

8 に答える 8

29

チャールズTThreadクラスのコードを読んだら、答えは見つかりますか。

   TThread = class  
   private type  

..
..
..   
   public  
     constructor Create(CreateSuspended: Boolean);  
     destructor Destroy; override;  
     procedure AfterConstruction; override;  
     // This function is not intended to be used for thread synchronization.  
     procedure Resume; deprecated;  
     // Use Start after creating a suspended thread.  
     procedure Start;  
     // This function is not intended to be used for thread synchronization.  
     procedure Suspend; deprecated;  
     procedure Terminate;  

このリンクを参照してくださいRADStudio2010:コミュニティパルス:翌日。(パート2)

編集:

スレッドを同期する必要がある場合は、TMutex、TEvent、およびクリティカルセクションに基づくスキームを使用できます。

さよなら。

于 2009-09-13T18:02:29.290 に答える
13

.Resumeの代わりにTThread.Startを使用します

--EDIT-- Startはもちろん、Delphi 2010(およびそれ以降)でのみ使用して、一時停止して作成されたスレッドを開始できます(以前はResumeを使用していたはずです)。

スレッドの同期にResume/Suspend(または対応するWinAPI関数)を使用することはお勧めしません。ここでの議論を参照してください(Barry Kellyのコメントを見てください)。

于 2009-09-13T17:49:46.537 に答える
7

SuspendResumeは、 TThreadクラスで壊れている可能性があります(または以前は壊れていました)(ソースを見ると、Suspendメソッドがブール値を指示されたスレッドの中断状態に直接無条件に設定していることがわかります。皮肉なことに、Resumeメソッドは、このより堅牢なインジケーターを使用して、一時停止状態のブール値を更新します。

これがおそらくそれらが非推奨になった理由です。また、独自のクラスを実装して、より堅牢なサスペンドおよびレジュームメカニズムと、スレッドの完了後にスレッドを再起動する機能を備えたWindowsスレッドをカプセル化したのもそのためです。

それらの非推奨がおそらく同期に関連している理由はわかりません。スレッドの一時停止と再開は、同期とは必ずしも関係ありませんが、同期がどのようになるかはわかります。興味深いことに、.NET FrameworkのThreadクラスの同等のメソッドは、同様に廃止されたものとしてマークされています。また、同期に関する同じコメントが、スレッドの一時停止/再開に関するWindowsAPIドキュメントに表示されます。

非推奨のメソッドを使用すると緊張し、それでも一時停止/再開したい場合は、いつでもWindows APIを使用して、ハンドルを参照することでスレッドを一時停止および再開できます。

于 2009-09-13T20:55:18.457 に答える
5

念のため、コンパイラのヒントを削除するだけでした。

(1)スレッドを開始するときにコンパイラのヒントを取り除くには..。

交換

MyThread := TMyThread.Create(True);
MyThread.Resume;

MyThread := TMyThread.Create(True);
MyThread.Start;

(2)スレッドを停止するときにコンパイラのヒントを取り除くには..。

交換

MyThread.Suspend;
MyThread.Terminate;

MyThread.Terminate;

大したことではありません。難読化の試みに注意してください。

于 2013-07-29T05:33:23.427 に答える
4

スレッド動作制御コードは、スレッドプロシージャ内にある必要があります。スレッドの実行を一時停止/再開するには、適切な同期オブジェクトと対応するAPI呼び出しを使用します。外からそれをすることは危険な習慣です。それで、それを奪うという決定がありました。

于 2009-09-13T18:55:27.293 に答える
3

次のようにスレッドを作成する必要があります。

constructor TSignalThread.Create;
begin
 // create event handle first!
  FEventHandle := CreateEvent(
          {security}      nil,
          {bManualReset}  true,
          {bInitialState} false,
          {name}          nil);
  FWaitTime := 10;
  inherited Create({CreateSuspended}false);
end;

このように、Startを呼び出す必要はありません。

このコードが機能する理由の説明については、http://www.gerixsoft.com/blog/delphi/creating-threadsを参照してください。

于 2010-07-03T15:55:47.877 に答える
3

使用する

Suspended := False; // Resume;

また

Start;
于 2013-09-24T06:21:44.230 に答える
2

@mghie(少し遅れて、私は知っている)

たとえば、madexceptなどを取り上げます。アプリケーションがクラッシュし、バグレポートがユーザーに表示されている場合は、ダイアログが使用入力を待機していることを意味します。クラッシュがスレッドアクションの結果である場合(必ずしもスレッドがクラッシュする必要はありません)、スレッドを一時停止しないと、画面にバグレポートダイアログが表示されます。

例2:ロギング。特別な理由で、少なくとも、いくつかのスレッドの実行状態をログに記録する必要がありました。これには、現在のスタックトレースが含まれます。さて、ご存知のように、スレッドの実行中はそれを行うことはできません。スレッドに関する情報を収集している間、スレッドは処理を継続するため、収集が完了するまでに収集される情報は一貫していません。したがって、スレッドを一時停止する必要があります。

そして、スレッド管理の実際的な例を続けることができます。確かに、これらは毎日のプログラミングで行うことではありませんが、少なくとも最初の例では、その内部に気づいていない場合でも、多くの人が使用していると確信しています。デバッガー?繰り返しますが、あなたはそれらを使用します。しかし実際、これらすべての場合、作業はスレッドハンドルで行われるため、TThreadは使用されません。したがって、実際、TThreadサスペンドの使用法の有効な例を見つけるのは困難です。しかし、一般的なスレッド、それは別の話です。

于 2011-03-01T08:32:42.520 に答える