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

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

multithreading - MsgWaitForMultipleObjectsEx が MFC アプリケーションのメイン STA スレッドをデッドロックする

STA スレッド同期を行うには何が最適でしたか?

メインと 2 番目の 2 つの STA スレッドを持つダイアログ ベースの MFC アプリケーションがあります。メイン UI スレッドで COM オブジェクトを作成しました。

2 番目のスレッドから COM インターフェイスを呼び出します。メイン スレッドでは、メイン スレッドが続行する前に 2 番目のスレッドが確実に終了するように、ループを使用してスレッドを待機します。このループは、MsgWaitForMultipleObjectsEx(timout=500) をループ的に呼び出します。

待っているとすぐに行き詰まりました。その後、MFC メッセージ ポンプである AfxInternalPumpMessage() は、呼び出しのブロックにのみ役立ち、デッドロック状態にはまったく役立たないことに気付きました。

次に、待機ループに Peek/Translate/DispatchMessage コードを追加すると、すべてが機能しました。

さて、Peek/Translate/DispatchMessage ループを手作業でコーディングしないと、STA スレッドの同期をまったく行うことができないようですか? 待機呼び出しがあると、デッドロックが発生します。では、STA スレッドを同期するための最善または標準的な方法は何ですか?

ありがとう!

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

visual-c++ - COM 発信呼び出しは、「アプリケーションが入力同期呼び出しをディスパッチしているため、発信呼び出しを行うことができません」という結果になります。

COM サーバー (C++/STA (MFC ベースのアプリ)) と COM クライアント (C#/MTA) があります。COM サーバーは MFC アプリであるため、STA 内に存在する必要があります (この件については選択の余地がありません)。クライアントはサーバーに呼び出しを発行し、サーバーはクライアントにコールバックを発行します。ここでエラーが発生します ( RPC_E_CANTCALLOUT_ININPUTSYNCCALL)。サーバーが MTA であった場合、この問題は発生しなかったと思いますが、残念ながら、MFC のドキュメントではアパートメントを MTA として初期化することを明示的に否定しています。

この問題を回避する方法についてのアイデアはありますか?

サーバー オブジェクト (実行中のオブジェクト テーブルを介して公開するオブジェクト) を独自のアパートメント (MTA) に配置するというアイデアをいじっています。これは良い考えでしょうか、それとも最初に試すのに簡単なものはありますか?

アップデート

サーバー オブジェクトは、アプリケーション内の特定の機能を指すシン インターフェイスにすぎません。ほとんどの場合、メモリ ロケーションの読み取りと書き込みを行うだけですが、アプリケーション内のさまざまなウィンドウにウィンドウ メッセージを生成する場合があります。サーバー オブジェクト自体はアプリケーション全体ではありません。

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

c# - wpf で System.Windows.Forms.FolderBrowserDialog を表示すると例外が発生する

wpfで表示しようとしましfolderbrowserdialogたが、この例外が発生しました

OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。Main 関数に STAThreadAttribute がマークされていることを確認します。この例外は、デバッガーがプロセスに接続されている場合にのみ発生します

この関数の前に [STAThread] を追加しようとしましたが、この例外を解決するにはどうすればよいですか?

機能は次のとおりです。

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

c# - C#でCOM STAスレッドのメッセージをポンプする方法は?

COM オブジェクトで多くのメソッドを呼び出すメイン STA スレッドと、同じオブジェクトでも多くの作業を行うセカンダリ STA スレッドがあります。メイン スレッドとセカンダリ スレッドを並行して動作させたい (つまり、メイン スレッドとセカンダリ スレッドからインターレース出力を期待している)。時々メイン スレッドでメッセージを送信する必要があることはわかっています。C++ で Get/Translate/DispatchMessage を呼び出すと、うまくいきます。

しかし、C#で同じ戦略を機能させるのに問題があります。最初に、メイン スレッドで CurrentThread.Join() を使用して、2 番目のスレッドに制御を渡しました。うまくいきませんでした。次に、Application.DoEvents() に目を向けました。2 番目のスレッドを実行したいときはいつでも、メイン スレッドで呼び出しました。その結果、2 番目のスレッドはすぐにコントロールを取得し、手放しません。2 番目のスレッドがすべて完了するまで、メイン スレッドは続行できません。

Application.DoEvents() がすべての待機中のイベントを処理するというドキュメントを読みましたが、GetMessage() は 1 つのメッセージのみを取得します。

どうするのが正しいのでしょうか?Get/Translate/DispatchMessage に相当する C# はありますか?

ありがとう

更新: 2 番目のスレッドの実行速度が速すぎて、大量の COM 呼び出しメッセージをメイン STA スレッドに送信しています。2番目のスレッドに遅延を追加して、速度を落としました。現在、2 つのスレッドが基本的に並行して実行されています。しかし、GetMessage/TranslateMessage/DispatchMessage に相当する C# があるかどうかを知りたいです。

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

c# - コンソール アプリでの STAThread COM 呼び出しの C# タイマー

COM を使用するメソッドを起動する必要があるコンソール アプリケーションがあります。プログラムは [STAThread] で始まります。プログラムは、タイマー プロセスを使用していない場合は正しく実行されますが、タイマーを使用している場合はコンソールへのブロックが発生するようです。

System.Threading.Timer と System.Timers.Timer を使用しましたが、どちらも機能しませんでした。現在、COM を使用するメソッド (Transmit()) を呼び出すスレッドを追加しました。Console.Readline でメイン スレッドをクリアすると、プログラムは COM オブジェクトがブロックされた場所から再開しますが、もちろんプログラムは終了し、必要なタイマー機能が失われます。

コンソール アプリケーションを使用しているときに、SynchronizingObject を設定して ISynchronizeInvoke コールバックを取得する方法がわかりませんでした。

複数のスレッドを探しているわけではありません。Transmit メソッドを定期的に呼び出して、コンソールに結果を返しながら COM を操作する必要があるだけです。

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

c# - WebBrowser コントロールに STA を使用する

アプリケーションに WebBrowser を追加して Web ページを表示できるようにしようとしていますが、スレッド タイプで問題が発生し続けます。

現在、私は得ています:

現在のスレッドがシングル スレッド アパートメントにないため、ActiveX コントロール '8856f961-340a-11d0-a96b-00c04fd705a2' をインスタンス化できません。

そして、この問題に関連するこの質問を見つけました:シングルスレッド アパートメント - ActiveX コントロールをインスタンス化できません

ただし、コードに Main() メソッドがなく、その質問に対する解決策を試みると、フォーム コントロールに WebBrowser を追加するときにエラーが発生します。


ここにあるコードを使用しています:

http://www.apress.com/9781430228530

直接ダウンロード: http://www.apress.com/downloadable/download/sample/sample_id/1173/

そして、私は第 14 章で、Horizo​​ntalExplorerBar フォルダー内にいます。


参照用に使用しているコードは次のとおりです。

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

.net - 多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。

SOには同様の質問がたくさんあります。しかし、私はかなり奇妙な状況にあります.Dispatcher.CurrentDispatcher.Invoke内で実行されている間にこの例外が発生します. 修正方法がわかりません。

これが私の StackTrace です (ディスパッチャーがそこで呼び出されていることがわかります):

System.Windows.Input.InputManager.GetCurrentInputManagerImpl() で System.Windows.Input.KeyboardNavigation..ctor() で System.Windows.FrameworkElement.FrameworkServices..ctor() で System.Windows.FrameworkElement.EnsureFrameworkServices() で System. Windows.FrameworkElement..ctor() の System.Windows.Controls.Control..ctor() の System.Windows.Controls.UserControl..ctor() の MCC.PresentationUtilities.ClosingAwareViewModelUserControl..ctor() の MCC.TherapyDeviceManager。 D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.PatientDetailUI\Views\PatientDetailView.xaml.cs:11 行目の MCC.TherapyDeviceManager.MultipleViewHost.Managers.TabItemFactory.PatientTabItemFactory.CreateEditableView にある PatientDetailUI.Views.PatientDetailView..ctor() (PatientDetailViewModel vm) D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.MultipleViewHost\Managers\TabItemFactory\PatientTabItemFactory.cs: D:\WTS\ の MCC.TherapyDeviceManager.MultipleViewHost.Managers.TabItemFactory.PatientTabItemFactory.Create(SelectedPatientChangedEventArgs 患者、IClosableController& コントローラー) の 41 行目D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager. MultipleViewHost\Managers\PatientEventsManager.cs: D:\WTS\WTS3\WTS\MCC の MCC.TherapyDeviceManager.MultipleViewHost.Managers.PatientEventsManager.AddPatientView(SelectedPatientChangedEventArgspatientInfo) の 94 行目。TherapyDeviceManager.MultipleViewHost\Managers\PatientEventsManager.cs: D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.MultipleViewHost\Managers\PatientEventsManager.cs の MCC.TherapyDeviceManager.MultipleViewHost.Managers.PatientEventsManager.DataImportFinishedHandler(DataImportFinishedEventArgs dataImportFinishedEventArgs) の 75 行目: Microsoft.Practices.Composite.Events.EventSubscription の 41 行目1.InvokeAction(Action1 アクション、TPayload 引数) D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventSubscription.cs:122 行目 Microsoft.Practices.Composite.Events.EventSubscription 1.<>c__DisplayClass2.<GetExecutionStrategy>b__0(Object[] arguments) in D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventSubscription.cs:line 108 at Microsoft.Practices.Composite.Events.EventBase.InternalPublish(Object[] arguments) in D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\EventBase.cs:line 69 at Microsoft.Practices.Composite.Presentation.Events.CompositePresentationEvent1.Publish(TPayload ペイロード) in D: \WTS\WTS3\WTS\MCC.TherapyDeviceManager.Definitions\Prism\CompositePresentationEvent.cs: MCC.TherapyDeviceManager.DeviceManager.DataRecordManager .<>c_DisplayClass5.b の 168 行目_4() in D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DataRecordManager.cs:MS.Internal の System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) の 247 行目。 Threading.ExceptionFilterHelper.TryCatchWhen (オブジェクト ソース、デリゲート メソッド、オブジェクト引数、Int32 numArgs、デリゲート catchHandler) で System.Windows.Threading.DispatcherOperation.InvokeImpl() で System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(オブジェクト状態) で System. System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode コード、CleanupCode backoutCode、オブジェクト userData) で System.Threading.ExecutionContext で Threading.ExecutionContext.runTryCode (オブジェクト userData)。System.Threading.ExecutionContext.Run(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態、Boolean ignoreSyncCtx) で System.Threading.ExecutionContext.Run(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態) で RunInternal(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態) System.Windows.Threading.DispatcherOperation.Invoke() で System.Windows.Threading.Dispatcher.ProcessQueue() で System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd、Int32 msg、IntPtr wParam、IntPtr lParam、Boolean& を処理) System.Windows.System.Windows.Threading.Dispatcher. MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd、Int32 msg、IntPtr wParam、IntPtr lParam) の InvokeImpl(DispatcherPriority 優先度、TimeSpan タイムアウト、デリゲート メソッド、オブジェクト引数、Int32 numArgs) MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame フレーム) で System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame フレーム) で System.Windows.Threading.DispatcherOperation.Wait(TimeSpan タイムアウト) で System.System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority 優先度、TimeSpan タイムアウト、Delegate メソッド、Object args、Int32 numArgs)、System.Windows.Threading.Dispatcher.Invoke(Delegate メソッド、Object[] args)、MCC.TherapyDeviceManager.DeviceManager.DataRecordManager でD:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DataRecordManager.cs:D の MCC.TherapyDeviceManager.DeviceManager.DataRecordManager.Process(DetectedDeviceInfo detectedDeviceInfo) の 247 行目の .DataImportedIntoDb(Patient patient, DetectedDevice detectedDevice, DataRecord dataRecord) :\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DataRecordManager.cs:D:\WTS\WTS3\WTS\MCC の MCC.TherapyDeviceManager.DeviceManager.DeviceToDatabaseSaverManager.CreateOrUpdateDeviceEntity(IDeviceDataInfo deviceDataInfo) の 66 行目。TherapyDeviceManager.DeviceManager\DeviceToDatabaseSaverManager.cs: D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DeviceToDatabaseSaverManager.cs の MCC.TherapyDeviceManager.DeviceManager.DeviceToDatabaseSaverManager.FoundDevice(IDeviceDataInfo deviceDataInfo) の 106 行目: MCC.TherapyDeviceManager の 88 行目D:\WTS\WTS3\WTS\MCC.TherapyDeviceManager.DeviceManager\DeviceToDatabaseSaverManager.cs:MCC.Devices.DeviceDetection.ConnectionManagers.ConnectionManagerAggregator.OnDeviceDetected(DetectedDeviceInfoEventArgs e) の 70 行目の .DeviceManager.DeviceToDatabaseSaverManager.DeviceDetectedHandler(Object sender, DetectedDeviceInfoEventArgs e) ) D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\ConnectionManagerAggregator.cs:MCC.Devices.DeviceDetection の 22 行目。D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\ConnectionManagerAggregator.cs:MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase の 58 行目の ConnectionManagers.ConnectionManagerAggregator.DeviceDetectedHandler(Object sender, DetectedDeviceInfoEventArgs e)2.OnDeviceDetected(DetectedDeviceInfoEventArgs e) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 33 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase2.D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase の 258 行目の AddDevice(TConnection 接続、DeviceData デバイス) 2.FoundDevice(TConnection connection, DeviceData newlyDetectedDevice) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 229 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase2.DetectDeviceOnAquiredConnection(TConnection 接続) D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:185 行目 MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase 2.Poll(TConnection connection) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:line 166 at MCC.Devices.DeviceDetection.ConnectionManagers.Managers.SdConnectionManager.Poll(FileConnection connection) in D:\WTS\WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\Managers\SdConnectionManager.cs:line 51 at MCC.Devices.DeviceDetection.ConnectionManagers.SpecificConnectionManagerBase2.PollingCycle(Object tokenObject, TConnectionMetadata detectedConnectionMetadata) in D:\WTS \WTS3\WTS\MCC.Devices.DetectService\ConnectionManagers\SpecificConnectionManagerBase.cs:142行目

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

c# - mainform から WebBrowser を使用して別のフォームを呼び出す - エラーが発生しますか?

form1 から from3 を呼び出していますが、InitializeComponent() でこのエラーが発生しています

エラー「現在のスレッドがシングルスレッド アパートメントにないため、ActiveX コントロール '8856f961-340a-11d0-a96b-00c04fd705a2' をインスタンス化できません。」

from3 には WebBrowser コントロールがあり、from1 には backgroundworker が実行されています

thnx

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

c# - C#WebBrowserエラースレッド

フォームのWebブラウザを機能させるのに問題があります。実行すると、このエラーが発生します。現在のスレッドがシングルスレッドアパートメントにないため、ActiveXコントロール「8856f961-340a-11d0-a96b-00c04fd705a2」をインスタンス化できません。

このテキストのフォームdesigner.csファイルに移動しますthis.webBrowser2=new System.Windows.Forms.WebBrowser(); そして、私はブラウザを機能させるために何をすべきか本当にわかりません。

Program.csファイルでMTAThreadとSTAThreadの両方を試しましたが、動作しないようです。

ありがとう

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

c# - C# キーボード クラスを使用する dll 関数を作成する方法

次のコードを使用して、特定の時間のキーボードの状態にアクセスしたいと考えています。

このコードをコンパイルするには、いくつかの dll が必要です: WindowsBase.dll および PresentationCore.dll

キーボードには STA スレッドが必要です。通常、[STAThread] 属性をメイン関数に書き込むと機能しますが、このコードは dll として使用されるため、それを行うことはできません。私の関数 ThisIsCalledByAnExternalProgram() は STA として実行する必要がありますが、そうではありません。

このコードを dll として動作させるにはどうすればよいですか?

編集: STAThread フラグ付きメソッド内で ThisIsCalledByAnExternalProgram() を呼び出すとどうなりますか?

外部プログラムで関数を呼び出すと、例外が発生します: System.InvalidOperationException: ...多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。スタックは次のとおりです。

編集#3:私は質問を読み違えました-...フラグが立てられたSTAThread内...私は現在これを試すことができません。それが成功して機能すると仮定します-呼び出し元のプログラムを制御できないため、これでも問題は解決しません。

編集#2:Win32フックを使用します:移植性のために.net内に留まりたいです。すべてのグローバル フック バリアントは、最終的に仮想マシンの下のマシンに依存します。準備された C# のキーボード クラスを使用したいと考えています。

これは別のコンテキストで機能します - ここに短いデモがあります: