前回残った Office の確認(起動時)¶
扱うこと: 起動時に、前回のインデックス作成が起動したまま残った Office を確認して終了する流れ・対象の選び方・出すタイミング・記録の置き方。扱わないこと: インデックス作成の実行そのもの(インデックス作成の実行)。先に読むページ: 画面。
インデックス作成を中断したときなどに、tebunko が起動した Excel・Word・PowerPoint が画面の無いまま残ることがある。これを、画面の起動時に 1 回だけ確認し、利用者が選んだときだけ終了する。専用のタブや常時の一覧は持たない。
止めてよいものの条件¶
プロセスの名前だけでは、利用者が開いている Office と見分けられない。そのため、インデックス作成が起動したときに PID の記録を書き(記録)、記録のあるものだけを対象にする。次の 4 つをすべて満たしたものを「残り物」とする。
| 条件 | 見るもの |
|---|---|
| 記録がある | この PC の鍵の記録(office_pids\<PC の鍵>\<PID>.txt)。ほかの PC の鍵のフォルダは読まない |
| 記録と今のプロセスが同じ | PID のプロセスの名前(EXCEL / WINWORD / POWERPNT)と起動時刻が記録と同じ。起動時刻が読めないものは同じとみなさない |
| 窓を持たない | MainWindowHandle が 0 |
| 起動した側がもう動いていない | 記録に書いた「持ち主」(起動した画面・インデックス作成のプロセス)が、今の画面ではなく、ほかにも生きていない(PID が無い、または起動時刻が違う) |
利用者が自分で開いた Office には記録が無いため、一覧にも出ず、止める対象にならない。
出すタイミング¶
起動時の読み込み(loadStartupData)の終わりに、記録の読み取りを画面の裏の仕事(startJob)で行い、結果が分かったら次の表で出すかを決める。上から見て最初に当てはまったものにする(getLeftoverPromptTiming)。
| 順 | 状況 | 結果 |
|---|---|---|
| 1 | 残り物が 0 件 | 出さない |
| 2 | ウィンドウを閉じている途中 | 出さない |
| 3 | インデックス作成中(そのインデックス作成の Office を止めないため) | 出さない |
| 4 | 起動時のお知らせがまだ閉じていない | 閉じたあとに、もう一度この表で決める |
| 5 | ほかのダイアログが開いている | 出さない |
| 6 | 上のどれでもない | 出す |
出さなかったときは何も止めず、記録も消さない。次の起動でもう一度確認する。
確認ダイアログ¶
確認ダイアログ(確認ダイアログ)で聞く。文言は判断層の getLeftoverPrompt が返す。
| 部品 | 内容 |
|---|---|
| タイトル | Office の終了 |
| 見出し | 前回の更新で起動した Office が N 件、残ったまま動いています。終了しますか?(数え方は「件」) |
| 説明(✓) | 編集中のファイルは閉じません(終了するのは、tebunko がバックグラウンドで起動した Excel 2 件・Word 1 件だけです。0 件のアプリは出さない) |
| 説明(✓) | 保存していない作業が失われることはありません(残っているのは、更新のために起動したものです) |
| 一覧 | アプリ・PID・起動した時刻 |
| 補足 | [今回は終了しない]を選んだときは、次に起動したときにもう一度お聞きします。(ボタンの真上に置く。本文の下に離して置かない) |
| ボタン | [今回は終了しない](既定の取り消し)・[終了する](主ボタン。赤にしない) |
終了と結果¶
[終了する]を選ぶと、確認を出した時点の PID のうち、今も残り物であるものだけを読み直して選び(getLeftoverTargets)、stopOfficeProcesses で終了する。確認の後に増えた残り物は、確認していないため止めない。
stopOfficeProcesses は、止める直前に PID が今も同じプロセスか(名前・起動時刻)をもう一度照らし直す。
| 結果 | 内容 |
|---|---|
| 止めた | Stop-Process -Force で終了し、記録を消す |
| もう無い | 止めず、記録を消す。止めた件数にも理由にも入れない |
| 別のプロセスに変わった | 名前か起動時刻が違う・今の起動時刻が読めない。止めない |
| 失敗 | 理由を返す。記録は残す |
結果はステータスに出す(getLeftoverResultText)。
| 状況 | 表示 |
|---|---|
| すべて止めた | Office を 3 件終了しました。 |
| 一部が変わっていた | Office を 2 件終了しました。PID 9316 は確認の後に別のプロセスに変わったため、終了しませんでした。(複数なら PID 9316・9320 は…) |
| 1 件も止めず、変わったものがある | 件数の文を出さず、PID 9316 は確認の後に別のプロセスに変わったため、終了しませんでした。 だけ |
| 失敗があった | 末尾に PID <N> を終了できませんでした:<理由> |
| 何も止めず、言うことも無い | ステータスは変えない |
| 裏の仕事そのものが失敗した(起動時の確認・[終了する]のあと) | getLeftoverFailureText。Office を終了できませんでした(<理由の 1 行目>)。残った Office は、次に tebunko を起動したときにもう一度確認できます。(確認の失敗は 前回残った Office を確認できませんでした(<理由>)。) |
記録¶
インデックス作成が Office を 1 つ起動し、新しいプロセスがちょうど 1 つ増えたと確かめられたときに、記録を 1 つ書く(shared/office/office_app.ps1 の getApp)。
| 項目 | 内容 |
|---|---|
| 置き場所 | <ワークスペース>\office_pids\<PC の鍵>\<PID>.txt(getOfficePidDir)。共有のワークスペースで、ほかの PC の PID と混ざらないよう PC ごとに分ける |
| 中身 | 1 行・タブ区切り: プロセス名・起動時刻(UTC の Ticks)・持ち主の PID・持ち主の起動時刻(UTC の Ticks) |
| 書き方 | <PID>.tmp に書いてから <PID>.txt に名前を変える(書きかけを読ませない) |
| 書かないとき | 起動時刻が読めない・利用者の Office に接続した(新しいプロセスが増えない)・プロセスが複数増えた(どれが自分のか分からない)・置き場所が決まっていない。書けなくても更新は続け、その Office は止める対象にならない |
| 消すとき | 終了を確かめたとき(stopApp)。終わらなかったときは残す。利用者がファイルを開いていて止めなかったときは、利用者に渡したものとして消す |
| 読むとき | PID のプロセスが無い・名前が違う・読めた起動時刻が違う記録は消す。起動時刻が読めないものは残し、止める対象にしない。形の違う記録は使わず、消さない。1 時間より古い .tmp は消す |
記録は、ワークスペースの中だけに書く(書き込み・削除する場所)。画面のスレッドでは読まない。
実装¶
| 部品 | 場所 |
|---|---|
| 記録の書き込み・読み込み・一覧・終了 | scripts/shared/office/office_process.ps1(addOfficeRecord・readOfficeRecords・getOfficeProcesses・stopOfficeProcesses)。プロセスの強制終了はここの 1 か所だけ |
| 記録の書き込み・削除の呼び出し | scripts/shared/office/office_app.ps1(getApp・stopApp)。置き場所は indexer_run.ps1 が getOfficePidDir で決めて渡す |
| 文言・出すかどうか・対象の選び方 | scripts/tebunko/ui/leftover_view.ps1(判断層。getLeftoverPrompt・getLeftoverResultText・getLeftoverPromptTiming・getLeftoverTargets・getLeftoverFailureText。詳細の時刻・開け閉めの文字・偽の行の変換もここ) |
| ダイアログと起動時の呼び出し | scripts/tebunko/ui/leftover_dialog.ps1(画面層)・scripts/tebunko/xaml/dialog_leftover.xaml |
画面の実装¶
画面側は scripts/tebunko/ui/leftover_dialog.ps1(画面層)と scripts/tebunko/xaml/dialog_leftover.xaml。
- 起動時の読み込み(
loadStartupData)の終わりにstartLeftoverCheckを呼ぶ。読み取りはstartJobで行い、結果をdecideLeftoverPromptに渡す。 - 起動時のお知らせ(
Add_Loadedで出すメッセージ)が開いている間は、お知らせの状態をgetLeftoverPromptTimingに渡して「待つ」にし、閉じたあとにresumeLeftoverPromptでもう一度決める。 - ダイアログは
showOwnedDialogで出す(.ShowDialog(は直接呼ばない)。既定の取り消しは[今回は終了しない]で、うっかり Enter で終了しない。 - [終了する]のあと、確認に出した PID を読み直して選び(
getLeftoverTargets)、stopOfficeProcessesで終了する。名前で探して終了することはしない。 - 結果の文は、ステータスの欄に出す(
setStatus。ステータス欄の枠は変えない)。
偽の行の継ぎ目(写真・画面のテスト用)¶
本物の Office を残さずに確認の画面を出せるよう、環境変数 TEBUNKO_GUI_LEFTOVER_FILE(JSON のファイル)を leftover_dialog.ps1 だけが読む。設定されているときは、記録の代わりにその JSON の行(Id・ProcessName・StartTime・StopStatus)を使い、終了も結果の文を作るだけでプロセスには触れない。設定されていなければ本物の動きになる(既定は本物)。tests/meta/leftover_seam.Tests.ps1 が、読むファイルが 1 つだけであること・プロセスを止める呼び出しが無いことを確かめる。
記録は共有のワークスペースにも置かれるため、置き場所がネットワークのときは、読み取りを専用の列(tebunko/core/workspace.ps1 の getWorkspaceJobQueue が network を返す)の仕事で行い、届かない共有で画面を止めない。