問題タブ [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.
multithreading - TThread.Resume を使用することの何が問題になっていますか?
昔、私が Delphi でスレッドを扱い始めたとき、私はスレッドTThread.Resume
のコンストラクターの最後で呼び出すことによってスレッド自体を開始させていましたが、今でも次のように行っています。
それ以来、代わりResume
に使用することを支持して廃止されましたStart
。ただし、Start
スレッドの外部からのみ呼び出すことができ、コンストラクター内から呼び出すことはできません。
上記のように使用してスレッドを設計し続けていますが、非推奨であることはわかっていますが、スレッドの外部Resume
から呼び出す必要がないという理由だけです。Start
呼び出す必要があるのは少し面倒です:
質問: この変更が行われた理由は何ですか? つまり、代わりResume
に使用することを望んでいるほど、使用することの何が間違っているのでしょうか?Start
EDIT Sedatの答えの後、これはコンストラクター内でスレッドが実際に実行を開始する時期に本当に依存していると思います。
multithreading - プロパティを持つスレッドの「一時停止」
TThread オブジェクトがあり、プログラムのメイン フォームのボタンを使用してスレッドを開始/停止できるようにしたいと考えています。これを行う方法を検討してきましたが、これまでのところ、次のアイデアがあります。
- ユーザーが停止をクリックするとスレッドを終了して解放し、開始をクリックすると新しいスレッドを作成します。
- スリープを使用してスレッドを遅らせます (これはやりたくありません)
- スレッドが一時停止されているかどうかを判断するブール値のプロパティがあります。Execute のコードは、このブール値が false の場合にのみ発生します。
私は#3に傾いています。メイン フォームから TThread オブジェクトにブール値のプロパティを設定すると、スレッドセーフになりますか?
これらのオプション、またはより良い代替手段のどれを使用する必要がありますか? スレッドを使用するのはこれが初めてなので、助けていただければ幸いです。
multithreading - TThread および COM - CoInitialize はコンストラクターで呼び出されますが、「CoInitialize は呼び出されていません」
スレッド内で COM インターフェイスを使用しようとしています。私が読んだことからCoInitialize/CoUninitialize
、各スレッドで呼び出す必要があります。
これが正常に機能している間:
呼び出しをコンストラクタとデストラクタに移動すると:
EOleException : CoInitialize has not been called例外が発生しましたが、その理由がわかりません。
delphi - TThread での奇妙な BitBlt メモリ リーク
画面のスクリーンショットを毎秒数回撮る簡単なプログラムがあります。それを行う簡単なコードを作成しました。何度でも実行でき、問題なく動作します。しかし、同じコードをスレッドに入れて実行すると、アプリケーションがリソースを使い果たすまで (約 10 秒で) メモリ使用量が増加し始め、スレッドはもちろんスタックします。
テスト用に、2 つのボタンがあるフォームを用意しました。1 つは前述のコードを実行し、2 番目は同じコードを実行するスレッドを開始します。最初のボタンで Enter キーを押してもメモリ リークは発生しませんが、2 番目のボタンをクリックすると、スレッドは即座にメモリ使用量を増やし続けます (stop_thread 変数を使用して停止することもできますが、メモリ使用量は高いままです)。
問題が BitBlt 行に関係していることはわかっています。BitBlt 行がないとメモリ リークがないからです。しかし、私は何が起こっているのか、なぜ起こっているのか理解できません。コードがメインスレッドから実行されているときに、なぜそれが起こらないのですか。Button1 コードをサイクルに入れてメイン スレッドからエンドレスに実行しても、メモリ使用量は低いままです。違いは何ですか?
アドバイスありがとうございます!
delphi-xe2 - TThread.CreateAnonymousThread での奇妙な動作
私はそれがどのように機能しているかを追うことができませんでした。
私の状況をよりよく説明するために、最初に非常に単純な例を示します。このコードは、新しいプロジェクトで作成された新しいフォーム Form1 内にあります。ここで、mmo1 はメモ コンポーネントです。
次に、このイベントのボタンがあります。
メモの私の出力は次のとおりです。
スレッド 4
スレッド 4
スレッド 4
本当にわからない。
最初の質問: なぜ「名前」の出力はスレッド 4 なのですか? 1 から 3 までの For ループです。少なくとも 1 または 3 である必要があります
秒: 最後のスレッド「スレッド 4」のみを実行する理由は、「スレッド 1」、「スレッド 2」、「スレッド 3」の順に 3 回ではなく?
なぜ私はこれを求めているのですか?プロセスが正常に動作しているオブジェクトがあります。しかし今、私はこのオブジェクトのリストを処理する必要があるという状況に陥っています。確かに1つ1つの処理はうまくいきますが、私の場合は互いに独立しているので、「うーん、それらをスレッドに入れれば、より速く実行できる」と思いました。
オブジェクトを変更してTThreadを拡張し、 Executeをオーバーライドすることを避けるために、TThread から継承するオブジェクトではなくプロシージャを使用してスレッドを実行する方法を調べ、Anonymous Thread を見つけました。1 つのオブジェクトでは非常にうまく機能しますが、オブジェクト リストをループしようとすると、奇妙な動作が発生します。
これは同じ効果があります。
確かに私はオブジェクトをきれいにしていません。これは私が実行していたいくつかのテストにすぎません。何か案は?または、この場合、TThreadから継承してExecuteメソッドをオーバーライドする必要がありますか?
面白いことに、これは問題なく動作します。
出力:
スレッド 1
スレッド 2
スレッド 3
delphi - スレッド Delphi からリストボックスまたはメモに追加
このスレッドを実行すると、リスト ボックスまたはメモに追加できないのはなぜですか? また、 のようなフォーム コンポーネントを読み取ることができませんTEdit
。空の文字列が表示されますか? スレッドを同期に入れようとしましたが、それも機能していません。HTTP リクエストの送信時にアプリケーションのフリーズを停止するには、スレッドを使用する必要があります。私のせいはどこですか?
そして、ここで、スレッドの呼び出し方法:
multithreading - TThread で MainForm を作成する
library
DLL をエクスポートし、ヘッダーを持つ Delphi 2010 アプリケーションがあります。次のように、TThread でその MainForm を作成します。
関数を介してこの DLL をロードLoadLibrary
すると、アプリケーションは正常に実行されます。(明らかに、私が渡したスレッドをLoadLibrary
メインスレッドとして使用しており、問題はありません)
しかし、この DLL を実際の EXE にエクスポートしようとすると、[オプション] -> [アプリケーション] で生成された出力を変更します。Windows API を介して DLL をロードする代わりに、ヘッダーを からlibrary
に変更してprogram
ビルドし、出力 EXE を実行すると、フォームを作成しようとすると、特に でアプリケーションがハングしますApplication.CreateForm(MyForm, form);
。アプリケーションの初期化をスレッドから削除してメイン ルーチンに配置すると、問題なく実行されます。
レンダリングしようとしているフォームは単なる空のフォームです。何か案は?
delphi - コンポーネントのコード内の TThread - Delphi 7
コンポーネントには、再生位置を追跡するための Tprogressbar と再生ボタンが含まれています。コンポーネントは完璧に動作しますが、代わりに TThread を使用したいTIdThreadComponent の、よろしくお願いします..