2015年9月25日金曜日

Windows10でTvRockのタスク登録が失敗する

あまり頻繁に録画しないので今日まで気づきませんでしたが、Windows8.1までは何の問題もなく稼働していたTvRock(0.9t8)がWindows10にして以後、スリープ状態からの復帰に失敗して録画予約が失敗する場合があることが分かりました。

「場合」と保留付きなのは、全ての予約に失敗するわけではなく、一部の予約だけ失敗するためです。

まず、録画できない原因は、tvrock.logによると”タスク登録でエラーが発生しました”という文言が記録されているので、タスクスケジューラへのタスクの登録に失敗しているため、スリープが解除されず、結果として録画できないという流れのようです。

確かに当環境では「復帰処理をタスクスケジューラで行う」チェックボックスをチェックして運用していましたので、このチェックボックスを外せばいいのでしょう。
先ほど一度だけですが、チェックを外した状態で5分後からの録画予約を行って直ちにスリープボタン押下によってスリープ状態に移行後、設定どおり録画3分前にスリープから復帰し、powercfg.exeで復帰理由を表示させてみても
C:\Windows\system32>powercfg /LASTWAKE
スリープ状態の解除履歴カウント - 1
スリープ状態の解除履歴 [0]
  スリープ状態の解除元カウント - 1
  スリープ状態の解除元 [0]
    種類: スリープ解除タイマー
    所有者: [PROCESS] \Device\HarddiskVolume5\local\bin\TvRock\tvrock.exe
と表示されたので、チェックボックスのチェックを外したままで運用できそうです(念のため当分様子を見たほうがよさそうですが)。

しかし、遺憾ながら、なぜタスクスケジューラへタスク登録が失敗しているかまではロギングされておらず、原因の特定ができません。
せめてGetLastError()やHRESULTの値だけでも出してくれていれば重要な手がかりになったのですが、そもそも開発終了どころかホームページも消えているという代物を勝手に使い続けているわけですから文句は言えません。

なぜWindows10のせいだと言い切るかというと、録画環境ではWindows10の稼働開始日時が2015/09/04 16:59:12なのですが、その直後から直ちにtvrock.logに”タスク登録でエラーが発生しました”という文言が現れるからです。
それ以前のWindowsVistaやWindows8.1時代のtvrock.logには一切そのような記録はありません。

疑問なのは、Windows10になってからなぜすべてのタスク登録に失敗せず、一部だけが失敗するようになったのか、です。
イベントログを見ても何のエラーも記録されていませんし、権限や設定ミスの問題であれば例外なく失敗または成功しなければ理屈に合いません。「一部だけ」というのが極めて不可解です。

この手のAPIを変更するなんてことは考えづらいのですが(手を加えるなら変更ではなくてAPIを追加するはず)、APIの変更があったのかと念のためにMSDNに当たってみても、WindowsVista時代の機能追加以後、ドキュメントは更新されていませんでした。

まあ、tvrock.logからは結果しか読み取れないので、タスクスケジューラに登録する前の手続きで躓いている可能性もありますので、タスクスケジューラだけ疑っても仕方がないのですが。

いずれにせよ、Windows10になって急に失敗するようになったので、こりゃあ例のごとくドキュメントにない変更を加えた挙句にバグを仕込んだという可能性が高そうです。WindowsUpdateの時などにも時々やらかしてくれるので困ります。

もうメンテナンスされる見込みがないTvRockを使い続けるほうにも問題がありますが、Windowsを使い続ける大きな理由の1つが後方互換性なのですから、やはりこういったことがないように注意深く仕上げてもらいたいところです。

Windows10がリリースされてからまだ日が浅いですが、「どうしてこんなところで?」と言いたくなるようなところでバグを見つけてしまうことが多いように思います。
InsiderPreview参加者がアルファ版テスタで無償アップグレード利用者がベータ版テスタという位置づけなんですかねえ。
従来も、サービスパックがいくつか出るまではこんな調子でしたから、いつも通りといえばいつも通りなんですが。。。まだまだ完成度は低いようです。
まだアップグレードしていない方はもうしばらく様子を見たほうがいいと思います。

12 件のコメント:

  1. ネットウラシマさん、はじめまして。匿名で投稿します。

    私も、TvRockで殆んど同じ問題に遭遇しています。
    違うのは、Windows10環境では、「タスク登録が常に失敗する」点です。
    同一のハードウェア構成でデュアルブートしているWindows7では、この問題は一度も起きたことはないのにです。

    Windows10環境では、TvRock番組表で、今放送中の番組を予約すると、番組表の該当欄には登録されますが、TVTestによる録画が始まりません。
     (Windows7環境で同じことをすれば、当然、直ぐに録画が開始されます)

    この際、TvRockのログには、”タスク登録でエラーが発生しました”が記録されています。

    この原因は、貴方意見と同様、Windows10のバグと考えています。
    というのは、MS社が運営するWindows10フォーラムで本問題を挙げ、
    Windows7とWindows10で、タスクスケジューラの要求仕様が変更されたかを質問したところ、MS社担当者からは、「仕様変更はない」との回答があったからです。

    更に本問題解決も要望しましたが、Windows10フォーラムでは、実装上の問題解決は受け付けないとのことであったので、Windows10フィードバックに、本要望を投稿しました。(ああ、私は「人柱」。。。)

    MS社のことなので、即解決とはいかないでしょうが、Windows7のサポートが終了する2020年までには、さすがに解決する?とは思っています。
    まあ、あまり期待せず、気長に待ちましょう。

    返信削除
  2. コメントをお寄せいただきありがとうございます。
    TvRock自身とタスクスケジューラ経由とでは、スリープが解除される要因がそれぞれタイマー由来とデバイス由来と言ったように異なるため、特に昔は多かったですがタイマーではスリープから復帰できない場合でも、タスクスケジューラからならば復帰ができる、というケースがありますので、Windows10でもタスク登録に失敗しなくなれば大変ありがたいところです。

    今までに随分お世話になっていますし、今後も長くTvRockと付き合っていきたいところです。

    返信削除
  3. 9月26日 1:06投稿の匿名(ハンドルネーム:ちょいギー)です。
    ayumiさん、早速のご返信ありがとうございます。

    「スリープが解除される要因」の話ですが、私の環境では、タイマー由来(復帰処理をタスクスケジューラで行うチェックボックスのチェック無し)も試しましたが、やはり復帰できませんでした。

    タイマー由来復帰可否は、ハードウェアの仕様(多分チップセットあるいはそのドライバ)に依存するのでしょうね。

    因みに、私のハードウェアのチップセットは、インテル製Z87 Expressですので、そのドライバについて調査してみます。

    返信削除
  4. デバイスで復帰できてタイマーで復帰できないのは厄介ですね。
    わたくしはH87を使用していますが、Z87との差異はOC可否程度ですのでチップセットそのものは問題ないと思います。
    タイマーで復帰しない要因は実に多様で一概には言えず、的外れであったり、すでにご確認済みであればお許し頂きたく、かつ僭越で恐縮ですが私の場合の点検項目は以下のようになると思います。

    ・コントロールパネルの電源オプションの詳細設定で「スリープ解除タイマーの許可」が有効になっているか
    ・高速スタートアップを無効にするとどうなるか
    ・ハイブリッドスリープを無効にするとどうなるか
    ・省電力関連のプログラムが追加でインストールされていないかどうか
    ・USB接続されている機器を取り外すとどうなるか
    ・オーバークロックしていれば通常に戻してみるとどうなるか
    ・UEFI/BIOSのACPIステートのS1/S3/S4の切り替え、BIOSで多段階スリープ機能があるなら殺してみる等、UEFI/BIOS設定を変更するとどうなるか
    ・Intel Smart Connect Technology、Intel Rapid Storage Technology、Intel Smart Response Technologyが邪魔をしていないかどうか

    これでだめなら・・・
    BIOS更新、クリーンインストール直後の状態ではどうなるか、旧OSではどうなるか、インストール済みアプリケーションを片っ端からアンインストール、VGAなどのデバイスの交換・・・をするよりも、EDCBに移行してしまうでしょう。

    長文な割にお役に立てそうもありませんね・・・申し訳ございません。

    返信削除
  5. ところで、タスクの登録に失敗する件ですが、少しわかったような気がします。
    TvRockの「復帰処理をタスクスケジューラで行う」のチェックボックスを「外した」状態で一度TvRockを終了して、Regedit.exeを起動して

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree

    の配下を見てみてください。
    TvRock#wakeup(x)といったような項目が並んでいませんでしょうか

    もし残っていたら、タスクスケジューラライブラリ画面からは見えませんが、破損したライブラリがレジストリに残っているためタスクの登録ができないようです。

    返信削除
  6. ありゃ、レジストリキー名が"Windows NT"のホワイトスペースで折り返されているように見えますね。実際には1行ですので一度コピーしてnotepadなどにペーストしてご覧ください。

    私の場合はwakeup(1)と(2)が残っていたため、一部のタスク登録ができないという状況になるようです。

    今度は、なぜGUIからも参照できないタスクが残るのか、という疑問がわきますが、まずは取り急ぎ。

    返信削除
  7. ちょいギー2015年9月27日 23:38

    ayumiさん、長文の情報ありがとうございます。

    ayumiさんの情報は、まだ詳細に確認できていませんが、私の方で解決方向の進展(Windows10でTVRockが正常動作)があったので、それについて書きます。

    実は、昨日までの私のWindows10環境は、クリーンインストールで構築したものであり、Windows7からのインプレースアップグレードではありませんでした。

    インストール方法を、クリーンからインプレースに変更したところ、Windows10でTVRockが正常動作しました。

    今のところ、「タスク登録が失敗」する現象も起きていません。

    また、合わせて分かったのは、私のWindows7環境(Windows10環境とハードウェア構成は同じ)では、タイマー由来復帰(復帰処理をタスクスケジューラで行うチェックボックスのチェック無し)もできたということです。

    ところが、同じハードウェア構成のWindows10環境では、タイマー由来復帰はできなかったということで、やはりこの原因は、既に書いたようにチップセット関連、あるいはタイマ関連のドライバの問題と推測されます。

    以上整理すると、私の環境では、Windows10をクリーンインストールすると、以下2つの問題(多分、Windows10のバグ)があったということです。

     ・タスクスケジューラへのタスク登録ができない
     ・タイマも正常動作しない

    私としては、クリーンインストールの方が、インプレースインストールより環境が安定すると予想したのですが、事実は逆だったということです。

    返信削除
  8. コメントをお寄せいただきありがとうございます。
    まずは一定の解決に至られ欣快と心得ます。

    H/W起因によるタイマー起床の阻害ではないことが明確になられたようですので、Windows10クリーンインストール時にご利用になられていた電源ポリシーではスリープ解除タイマーが不許可だった線が濃厚ですね。

    極めて興味深いのは、アップグレード時とクリーンインストール時ではタスクスケジューラのレジストリにゴミを残したり残さなかったりという挙動の違いです。
    もし再発せずに運用を行えたならば差異の調査によって実に興味深い知見が得られそうですが、タイマー起床が可能ならばこれ以上の追及は無用ですね。

    あまりお役に立てず恐縮ですが、H/W起因でないことが判明したことはご同慶の至りです。

    返信削除
  9. ちょいギー2015年9月28日 22:49

    ayumiさんへ御礼

    「あまりお役に立てず恐縮」と書かれていますが、ayumiさん作成の本記事に巡り合い、情報交換をしなければ、問題解決の糸口は、なかなか見つからなかったと思いますので、大変親切にご対応頂き感謝します。

    Windows10は、まだ始まったばかりで、今後も様々な問題に遭遇すると思いますので、その際はまた情報交換しましょう。

    今後とも宜しくお願いします。

    返信削除
  10.  レジストリにゴミが残ってtvrockがタスクを登録できなくなるのは、tvrockが登録するタスクが有効期限設定されており、有効期限が切れたら削除されるように設定されているためのようです。

     このタスクが掃除されて削除(expire)された際に、Windows10 になってからGUIやフォルダ(%windowsRoot%\system32\tasks)にあるxmlファイルは削除されるのに、レジストリからは削除されないため矛盾状態になったためのようです。その前までは問題なかったようなのですが。
     Tvrockは、タスク名Tvrock(1)からTvrock(11)までを使いまわしているようなので、有効期限切れが発生しやすい若番のtvrock(1)から徐々に使えなくなっていくようです。レジストリを削除すると使えるようになるのですが、expireされるタイミングがわからないので気を付けてみていないと、また登録エラーになって録画失敗してまいます。

     そこで、tvrockの「復帰処理をタスクスケジューラで行う」をオフにして、tvrockの録画スケジュールをチェックしてタスクを登録するpowershellスクリプト書いて運用しています。
    1週間ほど運用していますが、スリープ、休止からの復帰は問題なく使えています。

    返信削除
  11. コメントをお寄せいただきありがとうございます。

    なるほど、有効期限の取り扱いに起因していたのですね。これは思いつきませんでした。
    となりますと、これはMSさんの仕込みですね。。。
    既存のロジックに手を加えないでくれていればよかったのですが、どこかで故障が出て手を加えたのでしょう。
    タスクスケジューラは古来からある仕組みなので、(MSに金を払うだけの有力企業が)これに故障を唱える可能性もありますね。
    redstone等将来のアップデートでまたまた元に戻ったりしちゃうかもしれませんね。

    有用な情報をありがとうございました。

    返信削除
  12.  あんまり詳しくありませんが、以前、windows7の時に電源オプションで、「スリープ解除タイマーの許可」を「有効」にした所、スリープからの復帰が使えるようになった事がありました。

    返信削除