問題タブ [sta]
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 - スレッド化、COM+ および STA アパートメントに関するいくつかの質問
10 個のスレッド + タスク リストを作成するスレッドを作成する Windows サービスがあります。
これらの 11 のスレッドはそれぞれ、CoInitialize(nil) を呼び出すことによって STA に入ります。
- タスク リストは 1 つのスレッドによって作成され、他のスレッドはアイテムを取得し、処理して解放します ....
a) 他のスレッドは、他のスレッドによって作成されたオブジェクトを使用できますか? (それはうまくいくようですが..) b)他のスレッドは、他のスレッドによって割り当てられたメモリを解放できますか?(それはうまくいかないようです...)
どうにかしてスレッド間でポインターをマーシャリングする必要がありますか? または、少なくともアイテムを取得して処理する必要がありますが、それを作成したスレッドの「所有者」として解放する必要がありますか?
- 私のWindowsサービスでは、サービスを開始/停止するために使用できる機能を作成しました(スレッドの一時停止と再開)。
ただし、実際にデータを収集して間隔で実行するスレッドに問題があります。スレッドが処理する項目をロードすると、その後 5 分間スリープ状態になります。そのようなスレッドを安全に終了するにはどうすればよいですか? スリープ状態を中止するには?
よろしくお願いします。
multithreading - STA スレッドでの呼び出し (待機、com 呼び出し) のブロック
私は10以上のスレッドを作成するWindowsサービスを持っています:
- ジョブを実行してから、再開されるまで WaitForMultipleObjects 状態に入ります..
- 各スレッドは、その AppServer で TDCOMConnection コンポーネント呼び出しメソッドを作成し、接続を閉じます
サービスは問題なく動作しますが、メモリ リークの問題が発生しています。
その問題がメッセージのポンピングに関連している可能性があるかどうか、私はただ興味があります.
STA スレッドでのメッセージ ポンピングは、com マーシャリングを使用する場合にのみ適用する必要があると常に考えていました (2 つのスレッド間にプロキシがある状況で)。
しかし、今日、電話をブロックする場合はメッセージを処理する必要があることをどこかで読みました。本当?
ただし、私のアプリケーションは引き続き正しく機能し、それ自体をブロックしません...
たぶん、WaitForMultipleObjects の代わりに CoWaitForMultipleHandles を使用する必要がありますか?
この問題について何か考えはありますか?
c# - windowapplication の STA スレッド
以下に示すようなコードがプロジェクトに少しありますが、STA スレッドの使用法は何ですか? STA について私が知っているのは、シングル スレッド アパートメントであり、COM コンポーネントを使用する場合にのみ必要であり、アプリケーションのメイン エントリで使用されるということです。
wpf - WPF:別のドメインからユーザーコントロールにデータをマーシャリングする方法
別のアプリケーションドメインにある機能を使用する必要があります。結果はユーザーコントロールに表示されます。
私はそのようなものを持っています:
[Serializable]属性をWpfUserControllクラスに配置し、シリアル化コンストラクターとISerializableインターフェイスを実装する必要がありましたが、例外が発生します。
これはUserControl()コンストラクターから発生します
これを避けるために私は何をすべきですか?前もって感謝します !
==============================
解決
@Alが気付いたように、クロスアプリケーションドメイン呼び出しに関しては、ユーザーコントロールをシリアル化する必要があります。ここで、ICallbackインターフェイスを実装するプロキシを渡します。プロキシはSerializable属性でマークされました。
ユーザー制御インスタンスをもう一度逆シリアル化する試みがあるはずなので、プロキシの実装にはユーザー制御に関する知識がまったくないはずです。インターフェイスを介してユーザーコントロールからプロキシを抽象化しようとしたとき、それは役に立ちませんでした。インターフェイスをプロキシに渡そうとすると(ユーザーコントロールによって実装されました)、同じ例外が発生しました。
最後に、プロキシとユーザー制御をキュー/セマフォで切り離しました。キューは、ユーザー制御への呼び出しを委任したワーカースレッドによって監視されました
psこのキューは「MarshalByObjectRef」から継承する必要があります。
c# - クリップボードのテキスト変更を待機中 (エラー)
クリップボードのデータが変更されるたびに検出しようとしています。ということで、タイマーをセットして継続的に変化をチェックするようにしていClipboard.GetText()
ます。
私は次のコードを使用しています:
実行すると次のエラーが表示されます。
OLE 呼び出しを行う前に、現在のスレッドをシングルスレッド アパートメント (STA) モードに設定する必要があります。
誰かが理由を知っていますか?
multithreading - COM マルチスレッドと STA/MTA に関する質問
こんにちは、COM初心者です。STA モードと MTA モードの両方で COM dll をテストしたいと考えています。最初の質問は、COM オブジェクトが STA と MTA の両方をサポートすることは可能ですか?
ここで、以下の STA コード スニペットを想像します。
このコードは機能しますか? 基本的なことが欠けていますか?他のスレッドからの呼び出しを実行できるようにするには、メイン スレッドにウィンドウ メッセージ ループが必要であることはわかっています。私はそれについて何かしなければなりませんか?
次に、MTA のテストに進みます。上記のコードの「STA」を「MTA」に置き換えるだけで機能しますか?</p>
別の質問: GUI を使用するスレッドは STA でなければならないため、GUI スレッドで MTA を初期化してテストすることはできませんか?
事前に感謝し、COM とスレッドについて素朴で申し訳ありません。
com - STA COM オブジェクトのブロック方法は設計上の欠陥ですか?
COM オブジェクトが STA スレッドで作成されたとします。したがって、このオブジェクトへのすべての呼び出しは、このスレッドでシリアル化されます。したがって、オブジェクトのメソッドがブロックされている場合、このオブジェクトを使用するすべてのスレッドがブロックされます。
では、STA COM オブジェクトにブロッキング メソッドを持つことは、避けるべき設計上の欠陥なのでしょうか?
COM オブジェクトがフリー スレッドの場合、ブロッキング メソッドを使用しても問題ありませんか?
ありがとう
c# - 単体テストでWinFormsクリップボードを設定できません
Forms.ClipboardにNUnitテストからのテキストを入力したいと思います。
私が最初に遭遇した問題は、クリップボードをSTAモードで使用する必要があるということでした。メソッドにRequiresSTA属性を設定するソリューション(NUnit 2.5.x +)を見つけました。
次に、Clipboard.SetText()を呼び出すときにExternalExceptionが発生します。Clipboard.SetDataObject(object、bool、int、int)を使用する解決策を見つけました。ここで、retryTimesを指定して、クリップボードの設定を数回試行できます。このハッキーなソリューションは時々機能しますが、これは明らかに十分ではありません(retryTimesパラメーターを増やすと、もちろん成功する可能性も高くなります)。
他の人(たとえばPeter)はこれで成功したので、おそらくそれは私の環境と関係があります。私は.NET3.5およびx86をターゲットとするWindows764ビットでVS2010を実行しています。NUnitのバージョンは2.5.9です。
私は立ち往生しています。どんな助けでもいただければ幸いです。
c# - 別のスレッドでこのイベントを聞くにはどうすればよいですか?
製造元から提供されたActiveXコントロールを使用してUSBカードリーダーを動作させるための小さなテストプログラムを作成しました。
別のスレッドを使用しない限り、フォームは正常に機能します。の新しいインスタンスを作成してイベントをReader
リッスンすると、すべてが正常に機能します。Read
カードをスワイプすると、イベントが発生し、テキストボックスが更新されます。
役立つ場合のリーダークラス:
ただし、これを別のスレッドで実行する必要があります。だから私はコンストラクターを次のように変更します
STAスレッドである必要があります。そうでない場合、ActiveXコントロールはインスタンス化できないと文句を言います。ただし、これを行うと、イベントは発生しなくなります。私は糸脱毛がどのように機能するかについてあまりよく知らないので、理由はわかりません。
何か案は?コードは最終的には変更できないアプリケーションとともにデプロイされるクラスライブラリに存在するため、このように機能する必要があることに注意してください(別のスレッド、Readイベントに接続)。
.net - プログラムでApartmentStateをSTAに設定する方法はありますか?
特定のコンボボックスがクリックされたときにエラーをスローしていたPowerShellのGUIで作業しています。
エラーがスローされた後、コンボボックスリストをドロップダウンしてその内容を確認できましたが、同じdatagridviewで別のコンボボックスに移動すると、ドロップダウンリストが表示される前に同じ初期エラーが発生しました。
これをTechNetPowerShellフォーラムに投稿し、GUIをシングルスレッドアパートメント(STA)で実行するために必要な回答を得ました。PowerShellは、デフォルトではMTAで実行されますが、を-STA
呼び出すときにスイッチを使用することで、これを(v2.0では)上書きできますpowershell.exe
。
ただし、私のGUIは(MTAモードで)デフォルトのPowerShellアプリケーションを呼び出すだけなので、私の質問は、GUI /スクリプト内からプログラムでapartmentstateを設定する方法はありますか?
そうでない場合、私の次の試みは、アパートの状態を検出し、次のようなものを使用して、GUIの初期ロードからGUIを再起動しようとすることです。
編集:
したがって、私の回避策は機能します: