問題タブ [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.

0 投票する
1 に答える
1770 参照

multithreading - TThread および COM - CoInitialize はコンストラクターで呼び出されますが、「CoInitialize は呼び出されていません」

スレッド内で COM インターフェイスを使用しようとしています。私が読んだことからCoInitialize/CoUninitialize、各スレッドで呼び出す必要があります。

これが正常に機能している間:

呼び出しをコンストラクタとデストラクタに移動すると:

EOleException : CoInitialize has not been called例外が発生しましたが、その理由がわかりません。

0 投票する
0 に答える
338 参照

delphi - TThread での奇妙な BitBlt メモリ リーク

画面のスクリーンショットを毎秒数回撮る簡単なプログラムがあります。それを行う簡単なコードを作成しました。何度でも実行でき、問題なく動作します。しかし、同じコードをスレッドに入れて実行すると、アプリケーションがリソースを使い果たすまで (約 10 秒で) メモリ使用量が増加し始め、スレッドはもちろんスタックします。

テスト用に、2 つのボタンがあるフォームを用意しました。1 つは前述のコードを実行し、2 番目は同じコードを実行するスレッドを開始します。最初のボタンで Enter キーを押してもメモリ リークは発生しませんが、2 番目のボタンをクリックすると、スレッドは即座にメモリ使用量を増やし続けます (stop_thread 変数を使用して停止することもできますが、メモリ使用量は高いままです)。

問題が BitBlt 行に関係していることはわかっています。BitBlt 行がないとメモリ リークがないからです。しかし、私は何が起こっているのか、なぜ起こっているのか理解できません。コードがメインスレッドから実行されているときに、なぜそれが起こらないのですか。Button1 コードをサイクルに入れてメイン スレッドからエンドレスに実行しても、メモリ使用量は低いままです。違いは何ですか?

アドバイスありがとうございます!

0 投票する
3 に答える
1650 参照

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

0 投票する
0 に答える
142 参照

delphi - スレッド Delphi からリストボックスまたはメモに追加

このスレッドを実行すると、リスト ボックスまたはメモに追加できないのはなぜですか? また、 のようなフォーム コンポーネントを読み取ることができませんTEdit。空の文字列が表示されますか? スレッドを同期に入れようとしましたが、それも機能していません。HTTP リクエストの送信時にアプリケーションのフリーズを停止するには、スレッドを使用する必要があります。私のせいはどこですか?

そして、ここで、スレッドの呼び出し方法: