web-dev-qa-db-ja.com

TThread.resumeはDelphi-2010で非推奨になりました。代わりに何を使用する必要がありますか?

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

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

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

[DCC Warning] xxx.pas(277):W1000 Symbol ‘Resume’ is deprecated

Resumeが廃止された場合、何を使用すればよいですか?

編集1:

Resumeコマンドを使用してスレッドを開始します-'CreateSuspended'がTrueに設定され、Suspendでスレッドが作成されますスレッドを終了する前。

編集2:

delphi 2010マニュアルのリンクはこちら

35
Charles Faiga

チャールズ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;  

このリンクを参照してください http://wings-of-wind.com/2009/08/28/rad-studio-2010-community-Pulse-the-day-after-part-2/

編集:

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

さようなら。

28
RRUZ

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

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

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

13
PhiS

SuspendおよびResumeが、 TThreadクラス(ソースを見ると、Suspendメソッドがブール値を直接かつ無条件に、より確実に導出するのではなく、指定されたスレッドの中断状態に設定していることがわかりますスレッドハンドルの実行カウントからのこの状態。皮肉なことに、Resumeメソッドは、このより堅牢なインジケーターを使用してupdate一時停止状態のブール値)。

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

なぜ非推奨が同期に関連しているのかはわかりません。スレッドの一時停止と再開は必ずしも同期に関連しているわけではありませんが、同期の仕方はわかります。興味深いことに、.NET FrameworkのThreadクラスの同等のメソッドは、廃止されたものとして同様にマークされています。また、同じコメントw.r.t同期は、スレッドの一時停止/再開に関するWindows APIドキュメントに表示されます。

非推奨のメソッドを使用すると緊張し、それでもサスペンド/レジュームしたい場合は、常にWindows APIを使用して スレッドのハンドルを参照することにより、スレッドをサスペンドおよび再開 できます。

7
Deltics

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

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

取り替える

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

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

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

取り替える

MyThread.Suspend;
MyThread.Terminate;

MyThread.Terminate;

大したことではありません。気づく 難読化を試みた

5
Sam

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

4
Andrej Kirejeŭ

使用する

Suspended := False; // Resume;

または

Start;
3
Ilya

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

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 を参照してください。

3
Andriy Gerasika

@mghie(少し遅れて、わかっています)

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

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

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

2
ciuly