問題タブ [tthread]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - Delphi - TThread はメイン VCL スレッドの変数の値を変更できますか?
使用: Delphi XE2、Windows VCL フォーム アプリケーション
実行中の TThread はメイン VCL スレッドの変数の値を変更できますか?
TForm クラスのフィールドとして宣言されている Integer を更新する必要があります。これは、オーバーロードされた (そして再導入された) Create コンストラクター メソッドの var 変数として TThread に渡されます。
これにフォールバックはありますか?
delphi - TThread インスタンスが起動するのを待つ適切な方法は何ですか?
TThread
インスタンスの作成から起動までの間、メイン スレッドはコードの実行を続行します。メインスレッドのコードが問題のスレッドに依存して完全に稼働している場合、スレッドExecute
メソッドが実際に開始されるまで何らかの形で待機する必要があります。
次のコードを検討してください。
IsRunning
フラグを待機するループDoAction
がないと、含まれているウィンドウ ハンドルがまだ作成されないため、メッセージを正常に投稿できません。基本的にinc(Test)
内部WndProc
は発動しません。
スレッドの起動を待ってExecute
メソッド内で必要な初期化を完了するためのより良い方法はありますか、それともこの解決策はうまくいきますか?
注: とはスレッド セーフではないことを認識しており、上記の例のような製品コードでは使用しないでくださいAllocateHWnd
。DeallocateHWnd
multithreading - GUI コントロールに接続されている場合、TDataSet の非同期読み込みスレッドは安全ですか?
TThread の子孫を使用して、TDataSet にデータを非同期的にロードしたいと考えています。間違っていたら訂正してください。ただし、データセットが GUI コントロールに接続されていなければ問題はないと思いますが、TDataSet が、GUI コントロールにリンクされている TDataSource にリンクされている場合はどうでしょうか。myThread.synchronize は必要ですか?
multithreading - Delphi - カスタム スレッドが作成されない
ここで少し問題があります。TPersistent クラスを継承するカスタム クラスがあり、このカスタム クラスの内部 (プライベート セクション) には、オーバーライドされた Execute メソッドを使用して (1000 ミリ秒ごとに) 起動するカスタム TThread があります。2つのカスタムクラスを新しいユニットに移動するまで、すべてがうまく機能します...
上記のコードはメイン プロジェクト ユニットではうまく機能しますが、新しいユニットに移動するとスレッド コードが機能しなくなり、TMyClass オブジェクトを解放しようとすると AV が発生します。スレッドがまったく構築されていないと思います。そのため、スレッドを解放しようとすると AV が発生します...しかし、なぜですか? コードがどのユニットにあるかは問題ではありません...
ユニット1:
ユニット2:
multithreading - ループ変数の値が動的に作成された AnonymousThread に格納されない理由
動的に作成された に一意の識別子を格納する方法について、学術的な関心がありますTThread
。
私はこのようなものを作成します:
同期メソッドで表示できるように、動的に作成されたスレッドに一意の識別子を渡すことはできますか?
delphi - 突然破壊された TThread をキャプチャする方法
私は TThread を使用してソフトウェアに取り組んでいます。最近、プログラム開始から数日後に突然 TThread が破壊されるという問題に直面しています。
TThread では、スレッドは Synchronize() メソッドを使用してフォーム (TLable など) の表示を変更します。これは何か問題を引き起こすのではないかと思います。
問題の原因を突き止めることができるように、スレッドのいくつかの部分でログを記録しています。しかし、ログを確認すると、TThread のデストラクタが突然呼び出されていることがわかります。
TThread の FreeOnTerminate が true に設定されています。
プログラムは 2 つのスレッドを実行します。1 つのスレッドだけが突然破壊され、問題が発生した後も他のスレッドは動作しています。
この種の問題の原因をキャッチする方法を探しています。
multithreading - TThread.Resume を使用することの何が問題になっていますか?
昔、私が Delphi でスレッドを扱い始めたとき、私はスレッドTThread.Resume
のコンストラクターの最後で呼び出すことによってスレッド自体を開始させていましたが、今でも次のように行っています。
それ以来、代わりResume
に使用することを支持して廃止されましたStart
。ただし、Start
スレッドの外部からのみ呼び出すことができ、コンストラクター内から呼び出すことはできません。
上記のように使用してスレッドを設計し続けていますが、非推奨であることはわかっていますが、スレッドの外部Resume
から呼び出す必要がないという理由だけです。Start
呼び出す必要があるのは少し面倒です:
質問: この変更が行われた理由は何ですか? つまり、代わりResume
に使用することを望んでいるほど、使用することの何が間違っているのでしょうか?Start
EDIT Sedatの答えの後、これはコンストラクター内でスレッドが実際に実行を開始する時期に本当に依存していると思います。
multithreading - プロパティを持つスレッドの「一時停止」
TThread オブジェクトがあり、プログラムのメイン フォームのボタンを使用してスレッドを開始/停止できるようにしたいと考えています。これを行う方法を検討してきましたが、これまでのところ、次のアイデアがあります。
- ユーザーが停止をクリックするとスレッドを終了して解放し、開始をクリックすると新しいスレッドを作成します。
- スリープを使用してスレッドを遅らせます (これはやりたくありません)
- スレッドが一時停止されているかどうかを判断するブール値のプロパティがあります。Execute のコードは、このブール値が false の場合にのみ発生します。
私は#3に傾いています。メイン フォームから TThread オブジェクトにブール値のプロパティを設定すると、スレッドセーフになりますか?
これらのオプション、またはより良い代替手段のどれを使用する必要がありますか? スレッドを使用するのはこれが初めてなので、助けていただければ幸いです。