ティアのホームページ☆ミ:ID 1249:タイトル それがもう落とし穴 oC
no prev page 1/1ページ(1件) no next page
To Close..それがもう落とし穴 2015年03月13日11時06分
今頻繁に更新して、そろそろアップしようかと思っているのが、ファイルのコピーツール。

以前も書いたけど、ローカル同士、ローカルとoneドライブの間で同期が取れます。(一方的なコピーも出来ます。)

元と先の設定としては、
あくまで、ローカル対ローカル、ローカル対OneDriveなのですが、

同期設定の中には、元へコピーする機能もあるので、実質的にはOneDriveからローカルへコピーすることも可能です。

そう言う意味であれば、あれこれやりたい放題ではあるのですが、
以前書いたAPIの100M制限の問題。

は、未だ解決しておらず、公開するに至ってはおりません。


まぁ、それはそれとして、暫くAPI側をメインに修正していた関係で、ローカル同士でのコピーを行った場合の問題が出ました。

それは、PSO2関連で出てきたのですが、
あたしのとあるPCではランチャーを起動するだけでデータファイルが更新され、起動中もどんどんデータファイルが変更され続け、1時間もプレイすると50近くのデータファイルが更新されます。

これは、サポートにも問い合わせたのですが、ランチャーの問題でもPSO2のクライアントソフトの問題でも無いと言うことです。

まぁ、あたしも特定のPCでしか起きていない問題なので、似たようなQ&Aが有ったので、結構細かく状態を書いて贈ったのですが、Q&Aの症例とは違うものだと言うことに成ったので、取りあえず、そっちでの解決は止めました。


あたしも、プログラムくらいはいくらか組めるので、それを利用して、PSO2を起動する前に全部のデータファイルを開いて、共有設定で読み込みのみにしてしまえば、例え相手がウイルスでもファイルの書き込み権を得ることは出来ません。

因みに、データファイルが更新されないPCでこれを実行してPSO2を起動した場合、特に問題なく起動し、プレイできました。


しかし、データファイルが更新されてしまう側では、ランチャーを起動するには4,5個のファイルが書き込めないとエラーを出して起動してくれないので、これらを書込禁止の対象外にして、クライアントを起動させたのですがSEGAのロゴすら出ずに動作せず、終了も出来ない状態になります。

いくらか、終了を試みたりを繰り返し・・・出来ないので、タスクマネージャーで強制終了する感じです。

nProtectの関係で、普段はタスクマネージャーには表示されないので落とすのが結構大変です。



で、もう一つ考えたのが、正常に動く側から
動かない側にデータをコピーする。

ここで、先述のコピーツールが役に立つはずだったのですが・・・・

初めは日付のチェックとかの問題で、全ファイルをコピーされて、24Gコピーはそもそも結構時間が掛かり気にならなかったのですが、
テストのためにコピーを何度か実行していると、更新されたファイルが無くても、暫くフリーズするのです。


その現象を調べていたら分かったのです!

PSO2の3万個を超えるファイルを全チェックすると、変更が無いファイルは一瞬で終わるので、ファイルが全く更新されていない状態だと、チェックその物も、一瞬で終わります。

ここで問題です!

BackgroundWalkerは簡単にスレッド機能を搭載できて細かい設定をしなくても(Invokeしなくても)フォームを自由に操作できたりと色々と便利なのですが、残念ながら、高機能では無い(笑

コピーの対象がクラウドの場合ファイルのチェックやファイルの送信に結構時間が掛かるため特に問題が無かった部分が、一瞬で済んでしまうためにローカルでのコピーにはこの高機能では無いBackgroundWalkerが仇となったのです。

具体的に言うと、BackgroundWalkerに対して動作状況を通知するReportProgressを1ファイルごとに送信していたので、一瞬の間に3万回送信することになり、それでも、それら全てを処理するためにBackgroundWalkerがワーカースレッドが終了した後も、オブジェクトの終了待ちの所で長々と時間が掛かっていたのです。

そこで、処理ファイルの経過情報については、ReportProgressに下駄を履かせて、100ms以上間隔が開かないと通知を破棄して、送信しないようにしました。

この施策を入れる前は、画面の更新すら一切されずにフリーズしたまま、3万回のフォーム更新を行ったあげく瞬間的にオブジェクトが破棄されるという異常状態だったんですよ。

因みに、これをProgressChangedの方で実行は出来ません。プログラム上は書きませんがInvokeされた後にメインスレッド側でのイベントの処理に成るので、画面をしないだけでメインスレッドを拘束することに変わりはありません。

詳細に画面を更新しようと思いつつもReportProgressしすぎると、メインスレッドが止まるのは意味がありませんからね。


まぁ、それはそれとして、PSO2のクライアントが更新される原因は分かっていません。
一番可能性が高いのはウイルスだと思うのですが、特に検出されず、

もう一つの可能性としては、英語表示でプレイしていることですが、今のところ分からず。
因みに、日本語OSを英語表記にしているだけです。

でもまぁ、プレイ前にちょこっとコピーツールを実行するだけなら、一瞬ですので、毎回(1日に数度)ファイルチェックをしていた頃に比べれば全然ましです。

閉じる
テーマ:日記 URL:https://tsukiyori.sakura.ne.jp/index_m.cgi?ID=1249
 
no prev page 1/1ページ(1件) no next page