問題タブ [ui-thread]
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.
android - 読み込み中ダイアログの表示中/表示中に現在のアクティビティ ビューを更新する
アプリ フローが Android 標準とは異なるアプリがあります。
標準: アクティビティ A のボタンを押して、データをロードし、アクティビティ B のビューを構築している間に、このアクティビティのロードを表示してから、次のアクティビティを表示します。 (アクティビティ A で AsyncTask を呼び出し、データの送信が完了したらアクティビティ B を呼び出します)
必要なもの: アクティビティ A のボタンを押し、アクティビティ B に移動し、読み込みを表示しながら、読み込みの背後にあるアクティビティ B のビューを更新します。 (アクティビティ A から B に移動し、読み込み中に AsyncTask を呼び出します。AsyncTask が終了すると、読み込みが前面にある間にビューが更新され、ビューの更新プロセスが表示されます)
問題: これにより、読み込み中のアイコンが停止し、(操作に時間がかかるため) 応答しないダイアログが表示され、UI スレッドを使用して構築中のビューを変更することがあります。
同じ問題に関するいくつかの質問を読みました: Android: UI を動的に更新する方法は?
しかし、誰も一般的な答えを提供していません。
「それは推奨される動作ではありません」と答えた場合、同意します...ただし、これらは要件であるため、助けていただければ幸いです:-D
android - プログレスバースピナーが表示されない
プログレスバースピナーに問題があります。
これは、ユーザーがログインをクリックしたときに実行されます。スピンはグローバルプログレスバー変数です。以下は、スピナーを処理するために使用されるAsyncクラスです。
問題へ:私が書き込もうとした場合
ログイン認証後、スピナーはまったく表示されません。しかし、ProgressBar.Goneパーツを削除すると、スピナーが表示されます。ただし、その部分が存在する場合は、続行する前にアプリケーションが「ハング」しているように見えます(ユーザーにログインするか、ユーザー名またはパスワードが間違っていることを示すエラーメッセージを表示します)。
問題は何でしょうか?
ログインがそれほど速く行われず、スピナーがGONEに設定される前に表示される時間がないことは確かです。
c# - フォーム内のすべてのメンバーに対して「クロススレッド操作が無効です」というメッセージが表示されないのはなぜですか?
あるメンバーで「クロススレッド操作が無効」になりましたが、別のメンバーではなく、両方が同じフォーム、同じ UI スレッドに属していると思います。それらのメンバーはuxServerGroup
とuxServerListen
です。テキストを変更するuxServerGroup.ValuesSecondary.Heading
と正常に動作し、クロススレッド例外は発生しません。uxServerListen
しかし、ボタンを有効にしようとすると、1つ取得されます。なぜですか?
これらのコンポーネントはどちらも Krypton Toolkit に属しており、標準の Windows フォームではないことに注意してください。
これが私が持っているコードのサンプルです:
MainForm.cs:
SomeClass.cs:
ClassHandler.cs:
いろいろ調べた結果、以下のように修正しました。
追加の質問として、誰かが私にこれを説明してもらえますか ( の中のものMethodInvoker
):
c# - C#のスレッドからUIを更新する他の方法
私のアプリケーションは、非常に大きなデータの複雑な処理を行うためにスレッドに大きく依存しています。処理が行われている間、UIを更新する必要があります。私はUIを更新するための方法を知っており、使用しようとしましBackgroundWorker's
OnProgressChanged
た。RunWorkerCompleted
またInvoke
、UIスレッドのメソッドを使用して更新します。WinXP32ビットおよび64ビットOSではすべてが正常に機能しているようです。WinVistaおよびWin7(32ビットおよび64ビット)では、Invoke
メソッドを使用してUIを更新しているときに、アプリケーションがランダムにハングします。
Invoke
異なるWinOSでの変更の動作はありますか?スレッドからUIを更新する他の方法は何Invoke
ですか?
ありがとう
android - AndroidでUIスレッドを更新する最良の方法
フレームごとにビデオを再生するアプリケーションがあります。これはすべて機能しています。ただし、パフォーマンスの問題を調べてトレースビューを実行すると、メッセージをディスパッチするための呼び出しが多数あることに気付きました。これは多くの CPU 時間を使用していました。
アプリを見ると、現在のフレーム番号を表示するためにハンドラーを使用して ui にコールバックを送信しています。これを削除すると、traceview のすべての dispatchMessage 呼び出しがなくなりました。
だから私の質問は、それほど多くのオーバーヘッドを経験することなくワーカースレッドからUIを更新する最良の方法は何ですか?
**注: この呼び出しは 1 秒間に約 30 回行われます。
android - UI スレッドと通信できません
Android用の簡単なRPC機構アプリを作ったのですが、RPCクラスからUI Threadに戻れないという問題に直面しました。
基本的に3つのクラス(ServerActivity、ServerView、ServiceImplementation)があり、描画にRPCとProtocol Bufferを使用するため、3つのクラスを作成しました。
サーバー アクティビティ :
サービスの実装:
UI スレッドにアクセスできません。誰も理由を知っていますか?
ありがとう、ロバート
android - ゲーム オーバー ダイアログを表示すると、"Can't create handler inside thread has not called Looper.prepare()" というエラーが表示されます。
Android用の小さなゲームを書いています。ゲームは Thread を使用して SurfaceView に描画されます。スレッドの run() メソッド内で、ゲームが終了したかどうかをテストし、終了している場合は、ゲーム オーバーのダイアログを表示しようとしますが、前述のエラー メッセージが表示されます。このエラーは、非 UI スレッドが UI をいじろうとしたときに発生することを知っています。私が知りたいのは、そのようなダイアログを表示する最善の方法です。以下にコードを貼り付けました。ご協力いただきありがとうございます:
c# - WP7 でバックグラウンドで jpg をデコードする
私は市場にたくさんのアプリを持っていますが、これまでのところ、機能を変更するか、さらに一歩進んで、バックグラウンドで jpg を WriteableBitmap にデコードできないという問題を回避することができました。
問題を「回避」するための良い方法が思いつかない状況を見つけています。MediaLibrary から取得した画像をデコードし、解像度を管理可能なもの (800x800) に下げ、回転させてローカル ストレージに保存する必要があります。最も時間がかかるのは (80%)、ビットマップを 800x800 にデコードすることです。700 ミリ秒から 1000 ミリ秒かかります。ユーザーは、開始時に 7 ~ 10 枚の画像を追加できます。これは、画像が追加されるのを約 10 秒待つことに相当します。
私はこれを怠惰にやってみましたが、ある時点でパイパーに支払う必要があり、その時点でアプリは基本的に約 1000 ミリ秒途切れ、エクスペリエンスは良くありません。
どういうわけかバックグラウンドで画像をロードするために欠けている代替手段はありますか?
(CreateOptions.BackgroundCreation が私にとって良くない理由についての注意: 画像を BitmapImage に読み込みます。これは、単に使用したい場合には最適ですが、Isolated Storage にコピーを作成するために必要なことにはあまり適していません) .
c# - NotifyPropertyChanged が正しく機能しているにもかかわらず、ProgressBar が画面上で更新されない
初めまして、質問が長くなってしまい申し訳ありません。
現在複数の XML ファイルにデータを格納している Silverlight for Windows Phone 7 アプリを更新しています。CompactSQL DB を使用するようにアプリを更新しています。新しいバージョンをインストールした後、最初の実行時に XML ファイルから DB にデータを移行する必要があります。
各ファイルが DB に移行されるときの進行状況をユーザーに示す進行状況バー (IsIndeterminate=false) が必要です (操作には最大 2 分かかる場合があるため)。
問題は、NotifyProperyChanged イベントが発生し、バーの値が正しく更新されているにもかかわらず、プログレスバーが画面上で更新されない (または表示されない) ことです。XAML で値を設定すると、問題なく表示されます (静的ですが、少なくとも画面に描画されます)。
プログレスバーがデバイスにまったく表示されない理由がわかりません。
私の INotifyChanged セットアップ
読み込みに時間がかかりすぎるアプリは OS によって終了されるため、OnNavigatedTo ではなく Loaded で MigrateDB メソッドを呼び出します。
この操作には何年もかかります。1 分あたり約 100 個の XML ファイルであり、ユーザーは 30 ~ 300 個のファイルを持つと予想されます。
c# - C#でパケットを転送している間、UIを適切に更新するにはどうすればよいですか?
新しいスレッドを生成し、ループで UDP パケットのリッスンと待機を開始するこのフォームがあります。必要なのは、受信したバイト数で UI を更新し続けることです。
そのために、パケットが受信されるとすぐに発生するイベントをセットアップし、受信したバイト数を引数として渡します。UI スレッドで実行していないため、UI を直接更新することはできません。これが私が現在行っていることです:
しかし、これはまだパケット受信ループと同じスレッドで実行されており、EVENTHANDLER_UpdateTransferProgress
このメソッドが戻るまで、そのループには戻らず、別のパケットを待ちます。
私の質問は、基本的に上記の方法の次の行に関するものです。
このように UI を更新すると、パケットの受信が遅くなります。その行を削除 (またはコメント) すると、パケットの受信がはるかに高速になります。
どうすればこの問題を解決できますか? より多くのスレッドが重要だと思いますが、この状況でそれらを適切に実装する方法がわかりません....NET 2.0 で Windows フォームを使用しています。
編集:
私の以前のテストでは、上記は真実であるように見え、実際にはある程度そうである可能性があります. しかし、もう少しテストした後、問題は全体にあるInvoke(new MethodInvoker(() => { ... }));
ことに気付きました。それを削除して (もちろん UI は更新されません) EVENTHANDLER_UpdateTransferProgress
、イベントを発生させ続けると、パケットの受信がはるかに高速になります。
Invoke()
イベント ハンドラをまったく呼び出さずに、平均で約 1.5 秒かかるファイルの受信をテストしました。UI のコントロールを更新したり操作を行ったりしなくても (つまり、匿名メソッドの本体が空だった場合)、イベント ハンドラーを呼び出すInvoke()
と、約 5.5 秒と、はるかに長い時間がかかりました。大きな違いであることがわかります。
これを改善する方法はありますか?