問題タブ [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 投票する
2 に答える
483 参照

visual-c++ - TThread を何に置き換えるか

Borland C++ で記述された USB 通信 (「USBThread クラス」) のソース コードがあり、Visual Component Library (「vcl.h」) を使用しています。Borland C++ を購入していないので、私の仕事はそれを Visual C++ に移植することです。

しかし、この「USBThread クラス」は、「TThread」と呼ばれる「vcl.h」の基本クラスから継承されています。

Visual C++ で、「TThread」を新しい継承ソースとして置き換えるには、どのような基本クラスを使用できますか?

元のコードでは、TThread に付属する「WaitFor」メソッドと「Terminate」メソッドを使用していますが、これら 2 つのメソッドを Visual C++ で実装する方法がわかりません。

ありがとう!

0 投票する
2 に答える
2541 参照

delphi - すべてのメモリを解放しない TStringList および TThread

使用したバージョン: Delphi 7。

仮想 ListView で単純なforループを実行するプログラムに取り組んでいます。データは次のレコードに保存されます。

項目は索引です。SubItem1操作のステータス (成功または失敗)。SubItem2ファイルへのパス。forループは各ファイルをロードし、いくつかの操作を行ってから保存します。操作は TStringList で行われます。ファイルはそれぞれ約2MBです。

ここで、メイン フォームで操作を行うと、完全に機能します。

マルチスレッド、巨大なメモリの問題があります。どういうわけか、TStringList は完全に解放されていないようです。3 ~ 4k ファイルの後、EOutofMemory 例外が発生します。ソフトウェアが 500 ~ 600 MB に固執する場合もあれば、そうでない場合もあります。いずれにせよ、TStringList は常に EOutofMemory 例外を返し、ファイルをロードできなくなります。より多くのメモリを搭載したコンピューターでは、例外を取得するのに時間がかかります。

他のコンポーネントでも同じことが起こります。たとえば、 Synapse からTHTTPSendを使用すると、しばらくすると、メモリ消費量が多すぎるため、ソフトウェアは新しいスレッドを作成できなくなります。最大100MBである必要がありますが、約500〜600MBです。メイン フォームでは、すべて正常に動作します。

間違いは私の側にあると思います。多分私はスレッドを十分に理解していません。Destroyイベントですべてを解放しようとしました。FreeAndNil手順を試しました。一度に 1 つのスレッドだけで試しました。スレッドを手動で解放しようとしました(FreeOnTerminateはありません...)

運がない。

これがスレッドコードです。これはあくまでも基本的な考え方です。すべての操作を含む完全なコードではありません。LoadFile プロシージャを削除すると、すべて正常に動作します。スレッドプールに従って、ファイルごとにスレッドが作成されます。

何が問題なのですか?

ある時点で、作成されるスレッドが多すぎるのではないかと考えました。ユーザーが 100 万個のファイルをロードすると、最終的には 100 万個のスレッドが作成されますが、同時に作成されて実行されるスレッドは50 個だけです。

ご意見ありがとうございます。

0 投票する
2 に答える
765 参照

multithreading - MainFormのフリーズを防ぎ、サブスレッドからの戻り値を待つ方法

私は他のクラスで解析したいこのxmlファイルにxmlファイルをダウンロードするスレッドを持っています。これで、ダウンロードできるスレッドを準備できました。MainForm では WaitForSingleObject を使用していますが、この関数は MainFrom をフリーズさせます。ありがとう。

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

delphi - TThread がバックグラウンドで動作し続け、結果をリストボックスに表示するにはどうすればよいですか?

私が指定した Select ステートメントに基づいて、データベース内の値を監視し続けるプログラムを開発する必要があります。

監視された値はいつでも変更でき、私のプログラムは、私が指定したselectステートメントの結果に基づいて変更を感知する必要があります

私のシステムには別の機能もあり、ユーザーは値を監視するだけでなく、それに取り組む必要があるため、TThread を使用して選択結果を監視したいと考えています。

Delphi XE2 で TThread を使用してそれを行う方法

VCLを使用しています...いいえ.Net

よろしく。

0 投票する
4 に答える
12392 参照

multithreading - Delphi(XE2)Indy(10)マルチスレッドPing

私は60台のコンピューター/デバイス(40台のコンピューターと20台のオシロスコープがWindows CEベース)を備えた部屋を持っていますが、pingを使用して誰もが生きているか知りたいです。最初に、標準のping(ここでDelphi Indy Ping Error 10040を参照)を作成しました。これは現在は正常に機能していますが、ほとんどのコンピューターがオフラインになると時間がかかります。

だから私がやろうとしているのはマルチスレッドPingを書くことですが、私はそれにかなり苦労しています。私はインターネット上でほんの少しの例しか見たことがなく、誰も私のニーズに合っていなかったので、私はそれを自分で書こうとしています。

XE2とIndy10を使用していますが、フォームはメモとボタンのみで構成されています。

私の問題は、「sleep(10)」のコメントを外すと機能するように見え、それなしでは機能しないように見えることです。これは確かに、私が書いたスレッドのポイントが欠落していることを意味します。

言い換えると。Sleep(10)がコードに含まれている場合。ボタンをクリックして接続を確認するたびに、結果は正しいものでした。

sleep(10)がないと、ほとんどの場合動作しますが、結果が間違って、オフラインコンピューターではpingエコーが発生し、オンラインコンピューターではpingエコーが発生しないことがあります。これは、ping応答が正しいものに割り当てられていないためです。スレッド。

コメントやヘルプは大歓迎です。

-----編集/重要-----

この質問の一般的なフォローアップとして、@DarianMillerはここ https://code.google.com/p/delphi-stackoverflow/でGoogleCodeプロジェクトを開始しました。これは実用的な基盤です。私は彼の回答を「承認済みの回答」としてマークしますが、将来確実に拡張および更新されるため、ユーザーはこのオープンソースプロジェクト(すべてのクレジットは彼に帰属します)を参照する必要があります。

0 投票する
2 に答える
437 参照

multithreading - TThread派生クラス内でのTThreadの再作成

TThreadクラスから派生した新しいクラスを作成し、コンストラクターで「inherited Create(True);」を呼び出し、Execute()呼び出しをオーバーライドしたため、「Resume()」を呼び出します。次に、Execute()を呼び出します。 )(スレッドを再度実行)クラスインスタンスを破棄せずに、新しいクラス内に「myRestart()」という関数があります。これは「継承されたCreate(True)」を呼び出します。そして、「Resume()」を再度呼び出すことができるようになり、スレッドが再び機能します。

私の質問は、これは安全な方法ですか?このクラスのインスタンスが複数ある場合も機能しますか?またはそれを行うためのより良い方法はありますか?

ありがとう

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

delphi - バックグラウンドスレッドで LoadKeyboardLayout を使用するには?

LoadKeyboardLayout関数を使用して、この方法でキーボード レイアウトを読み込んで有効にしています。

完全に機能しますが、この変更には時間がかかるため、アクティブなフォームが 1 ~ 2 秒間フリーズします。これを防ぐために、このコードを次のようなバックグラウンド スレッドに移動しました。

このバックグラウンド スレッドは、次のように実行しています。

問題は、期待どおりにキーボード レイアウトが変更されないことです。コードをデバッグしたところ、すべての行が実行されました。LoadKeyboardLayout関数だけが機能していません。

LoadKeyboardLayout関数をバックグラウンド スレッドから動作させるにはどうすればよいですか?

0 投票する
4 に答える
3785 参照

delphi - Indy10によって最初にdelphiでサーバーから通信を開始します

TCPServer /クライアントコンポーネントによってプログラムされたSocketアプリケーションでは、通常、サーバー側をアクティブにしてからクライアントをサーバーに接続します。一方の側からもう一方の側にデータを取得または送信する必要がある場合は、最初にクライアントからサーバーにコマンドを送信します。開始します。

しかし、問題は常にクライアント側から会話を始める必要があるということです!

クライアント側の要求なしにサーバー側からランダムに会話を開始するためのアイデアはありますか?

サーバー側からクライアントに通知するには、この機能が必要です。たとえば、登録ユーザー(クライアント側)がサーバーに接続し、他の接続ユーザー(他のクライアント側)が接続している場合、サーバーからすべてのユーザー(Yahoo Messengerなど)に通知を送信する必要があります。

TIdCmdTCPServerおよびTIdTCPClientコンポーネントを使用しています

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

delphi - TThread.Synchronize と DLL による AccessViolation

Delphi XE2 で DelphiPraxis の WorkerThread を使用しています。 http://www.delphipraxis.net/93835-workerthread-der-diener-im-hintergrund.html JobThread で、DLL をロードしていますが、これは (テストのために) 待機しています。

「StatusCallback」は、DLL をロードしているスレッド内のプロシージャへの参照です。

私のコールバックは次のようになります。

どの呼び出し:

OnStatus イベントハンドラ:

この問題は、DLL が MainThread と同期できないことに関係していると思います。同期を回避するためのアイデアはありますか (それが実際に問題である場合)?

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

multithreading - 画像処理 Delphi のスレッドの同期

メインフォームで1つの画像を処理する必要がありますが、スレッドを使用するインク速度に対して処理速度が遅いです...

私のスレッドコード:

そして、私はそれを on で使用していますtimer:

しかし、実行時にエラーが発生しDoWritePixました:

私の質問: メインフォームの編集画像にその方法は正しいですか? そうでない場合、スレッドへのアクセスと書き込みの正しい方法は何ですか? はいの場合、どうすれば問題を解決できますか?