問題タブ [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.CurrentThread と EAccessViolation - これはバグですか、それとも私の能力不足ですか?
Delphi 2009 では、アプリケーションで TThread.CurrentThread を使用するたびに、アプリケーションを閉じるときに次のようなエラー メッセージが表示されることがわかりました。
私のマシンでない限り、これを数秒で複製できます。新しい Delphi フォーム アプリケーションを作成し、フォームにボタンを追加し、ボタンのイベント ハンドラに次のようなものを使用します。
Vista マシンと XP マシンの両方で、ボタンをクリックしなければ問題ありませんが、ボタンをクリックすると、アプリケーションを閉じるときに上記のエラー メッセージが表示されます。
だから...これはバグなのかと思っていますが、同時に、DelphiでTThreadsを操作する方法について非常に基本的なことを理解していない可能性が高いと思います. 私は少しDelphi初心者ですが、恐れています。
そのように TThread.CurrentThread を使用すると明らかに問題がありますか?
そうでない場合、Delphi 2009 を使用している場合、私の単純なサンプル プロジェクトを実装すると同じ問題が発生しますか?
更新: François が以下に指摘したように、これは実際には現時点で Delphi 2009 のバグです。ここで投票できます。
更新: このバグは Delphi 2010 で修正されました。
c++builder - Borland C++ ビルダーのコードを Linux に移植するにはどうすればよいですか?
C++ で記述され、Visual Component Library を使用する Windows DLL のソース コードがあります。今、私の仕事はそれを Linux に移植することですが、VCL 自体のソース コードもドキュメントもありません (そして、Borland C++ を使用したことはありません。Windows 時代には MFC を使用していました)。
私の DLL には GUI がないので、これはそれほど難しいことではありません。TThread を継承するクラスに出くわしましたが、そこで行き詰まってしまいました。インターネットで検索しましたが、VCL に関するドキュメントは今のところ見つかりませんでした。Amazon からの到着を待つ時間がないため、Borland C++ Builder に関する本を購入するのは避けたいと思います。仕事で Linux ボックスしか持っていないため、Windows 用のパッケージを購入することは考えられません。
助言がありますか?
delphi - TThread オブジェクトを破棄する適切な方法
この質問は些細なことのように思えるかもしれませんが、無視しないでください。
通常、TThread オブジェクトを破棄する前に、TThread.Execute() メソッドを呼び出したスレッドが終了するまで待機する必要があります。これは、たとえば、クラスのデストラクタ内で破棄されたオブジェクトがアクセスされなくなったことを確認できるからです。したがって、Terminate を呼び出して終了するかどうかを知るためにスレッドがチェックする必要のある Terminated フラグを設定してから、WaitFor() メソッドを呼び出す必要があります。
スレッドが一時停止している可能性があるため、WaitFor を呼び出す前にスレッドを再開するのがよいと思います。そうしないと、呼び出し元のスレッドがデッドロックしてしまいます。また、スレッドは複数回中断できるため、同じ回数だけ再開する必要がありますよね?
スレッドがサスペンド状態で作成された場合、スレッドを終了するためだけにスレッドを再開するときに TThread.Execute() メソッドが呼び出されることを心配する必要はありません (間違っていたら訂正してください)。
私が述べたことは、解放される各 TThread オブジェクトに対して次のコード行を使用することを提案しています。
残念ながら、複数のスレッドを作成したアプリケーションを破棄する場合、破棄される TThread オブジェクトごとにそのようなコードを不必要に記述すると、コードが非常に長くなり、場合によっては不透明になります。
したがって、これらすべてを TThread クラスのオーバーライドされたデストラクタ内に配置できるという結論に達しました。そのおかげで、破棄されたかどうかを気にせずに MyThread.Free (または MyThread.FreeOnTerminate が設定されている場合は MyThread.Terminate) を呼び出すだけで十分です。 object が TThread オブジェクトかどうか:
こんな初歩的な質問ですみません。ただし、TThread オブジェクトを破棄するこの方法 (普遍的な方法であることを願っています) について、あなたの意見を知りたいと思います。同僚のコードから、彼らは通常、最初のコード例を使用してそのようなオブジェクトを破棄することを学びましたが、待機中のスレッドが中断されていないかどうかを確認することは一度もありませんでした。コードのどこかで中断されている可能性があります。したがって、コードをより明確かつ安全にする、このクラスのオブジェクトを破棄する普遍的な方法を見つけようとしました。私はそれを悪化させなかったことを願っています - あなたはどう思いますか?
事前にご提案いただきありがとうございます。
delphi - delphi-アプリケーションを閉じるときにすべてのスレッド(TThread)を終了します
私のアプリケーションはtcp/ipサーバーであり、メインスレッドは1回だけ作成され、常にリッスンしています。新しいクライアントが接続すると、メインスレッドはそのタイプの新しいスレッドを作成しますTClientThread
。ただし、実行中のクライアントスレッドのリストはありません。これは、アプリが少し複雑になるためです。スレッドがビジー(私の場合は「ビジー」)であっても、すべてのスレッドで「terminate」メソッドを実行する方法はありますか。タイムアウトセットが約30秒であるデータを待機していることを意味します...したがって、待機せずにとにかくデータを強制終了する必要があります。)?単純なクローズアプリケーションは、スレッドで「終了」メソッドを実行していないようです。これにより、FastMMによってメモリリークが報告されます...
c++ - C++Builder-オンザフライでTThreadsを生成します
スレッドまたは関数を生成して、すぐに呼び出し元の回線に戻り、プログラムを続行し、スレッドの作業を続行できるようにする機能を探しています。
たとえば、Form.ShowDialog()を呼び出すと、独自のUIスレッドを持つモードレスフォームが作成されます。
TThreadクラスを宣言せずにこれを(フォームなしで)行う方法はありますか?それが存在する場合でも、匿名スレッドのようなものだと思います。
delphi - 非推奨のTThreadメソッドSuspendの呼び出しをどのデルファイコードに置き換える必要がありますか?
以前に尋ねられましたが、完全な答えはありません。これは、いわゆる「致命的なスレッドモデル!」と関係があります。
このTThread.Suspendの呼び出しを、終了または再開したときに返される安全なものに置き換える必要があります。
元の回答は、「TMutex、TEvent、およびクリティカルセクション」を漠然と示唆しています。
私はTThreadThatDoesntSuckを探していると思います。
コメント用に、Win32Eventを使用したTThread派生物のサンプルを次に示します。
delphi - Delphiでスレッドメッセージループがハングする
私が取り組んでいる単純なDelphiプログラムがあります。このプログラムでは、スレッドを使用してプログラムの機能をGUIから分離し、より長いタスクなどでGUIの応答性を維持しようとしています。 「コントローラー」TThread、および「ビュー」TForm。ビューは、を介してコントローラーメッセージを送信するために使用するコントローラーのハンドルを認識していますPostThreadMessage
。これまで、この種のモデルをメインフォームではないフォームに使用しても問題はありませんでしたが、何らかの理由で、このモデルをメインフォームに使用しようとすると、スレッドのメッセージループが終了します。
スレッドメッセージループのコードは次のとおりです。
コントローラを設定するには、次のようにします。
メインフォームのメッセージを処理するために、次のループと次のループの両方を使用してみApplication.Run
ました(直後Controller.Resume
)
私はここで立ち往生しています-どんな助けでも大歓迎です。
delphi - Delphi で別のスレッドで WebService を実行する際の問題
私はいつも自分で問題を解決したか、オンラインで見つけることができたので、コミュニティで質問したことはありません. しかし、これで私は行き止まりになり、助けが必要です! わかりやすくするために、他の場所で見つけた単純なアプリを Tthread オブジェクトを使用するように変換しました。アイデアは単純です。アプリは Web サービスを使用してオンラインでチェックし、THTTPRIO コンポーネントを介して天気を調べ、結果を Memo1 行に入れます。
Button1 をクリックすると、標準的な方法で実行されます。Form1 に配置された THTTPRIO を使用し (元のアプリと同様に、ここでは htt と呼ばれます)、メインおよび唯一のスレッドを使用します。
Button2 をクリック – クラス TThread を使用します
WeatherThread1 ユニットの Execute プロシージャに、次のコードを追加しました。
...そして GetForecast コード:
プロシージャ ShowWeather は Form1.Memo1 に結果を表示します。ここで問題があります。メイン スレッドで Button1 をクリックすると、すべて正常に動作します。しかしもちろん、HTTPRIO コンポーネントが通信すると、フォームがフリーズします。
Button2 を使用して、コードを別のスレッドに入れましたが、動作したくありません! 何か奇妙なことが起こります。アプリケーションを起動して Button2 をクリックすると、HTTPRIO コンポーネントの使用時にエラーが発生します。しかし、最初の Button1 と AFTER THAT Button2 をクリックすると、しばらくは機能します (ただし、しばらくは機能しますが、5 ~ 7 回のクリックのみです)。何か間違ったことをしていると思いますが、問題の場所と解決方法がわかりません。スレッド化されたユニットのコードはスレッドセーフではないように見えますが、スレッドセーフである必要があります。スレッドで HTTPRIO を動作させる方法を教えてください!!!
圧縮された完全なコードはこちらにあります。
multithreading - TThread (Terminate、FreeOnTerminate、およびスレッドの領域におけるその他の冒険) に関するいくつかのヘルプ
私は次のことを達成しようとしています(Delphi7を使用):プログラムにログインした後、ユーザーは制御を取得しますが、バックグラウンドで別のスレッドがインターネットからファイルをダウンロードして、現在のライセンスキーがブラックリストに登録されているかどうかを確認します. そうである場合、ユーザーはプロンプトを受け取り、プログラムは終了します。
そこで、InternetOpenURL/InternetReadFile を使用してネットからブラックリストをダウンロードする別の TThread クラスを作成しました。
私の問題は次のとおりです。
バックグラウンドでのダウンロードが完了する前にユーザーがプログラムを終了した場合、ライセンス マネージャー スレッドはメイン スレッドによって終了される必要があります。
スレッドがジョブを完了した場合、スレッドは自動的に終了するはずです。
FreeOnTerminate := true を使用すると、メイン スレッドからスレッドを終了できません。しかし、それ以外の場合、スレッドがジョブを完了した後にリソースを解放するにはどうすればよいでしょうか?
私の他の質問は次のとおりです。
ライセンス キーがブラックリストに登録されている場合は、Synchronize を使用して、アプリケーションのメイン フォームの特定のリソースを処理します。
しかし、たとえば、ユーザーが既にアプリを閉じていて、プログラムがメイン フォームの FormDestroy にあるかどうかを知るにはどうすればよいでしょうか? 同期するタイミングを間違えると、アクセス違反が発生する可能性があります...
ありがとう!
multithreading - 自動または手動でTThreadを解放します
プログラムにメインスレッドと別のスレッドがあります。別のスレッドがメインスレッドの前に終了すると、自動的に解放されます。メインスレッドが最初に終了した場合は、別のスレッドを解放する必要があります。
FreeOnTerminateについて知っていますが、慎重に使用する必要があることを読みました。
私の質問は、次のコードは正しいですか?