1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { BaseElement, element } from '../../../../base-ui/BaseElement';
17fb726d48Sopenharmony_ciimport { LitTable } from '../../../../base-ui/table/lit-table';
18fb726d48Sopenharmony_ciimport { procedurePool } from '../../../database/Procedure';
19fb726d48Sopenharmony_ciimport { info } from '../../../../log/Log';
20fb726d48Sopenharmony_ciimport { TableNoData } from '../TableNoData';
21fb726d48Sopenharmony_ciimport '../TableNoData';
22fb726d48Sopenharmony_ciimport { LitProgressBar } from '../../../../base-ui/progress-bar/LitProgressBar';
23fb726d48Sopenharmony_ciimport '../../../../base-ui/progress-bar/LitProgressBar';
24fb726d48Sopenharmony_ciimport { LitChartColumn } from '../../../../base-ui/chart/column/LitChartColumn';
25fb726d48Sopenharmony_ciimport '../../../../base-ui/chart/column/LitChartColumn';
26fb726d48Sopenharmony_ciimport { Utils } from '../../trace/base/Utils';
27fb726d48Sopenharmony_ci
28fb726d48Sopenharmony_ci@element('top10-longest-runtime-process')
29fb726d48Sopenharmony_ciexport class Top10LongestRunTimeProcess extends BaseElement {
30fb726d48Sopenharmony_ci  traceChange: boolean = false;
31fb726d48Sopenharmony_ci  private processRunTimeTbl: LitTable | null | undefined;
32fb726d48Sopenharmony_ci  private threadRunTimeTbl: LitTable | null | undefined;
33fb726d48Sopenharmony_ci  private processRunTimeProgress: LitProgressBar | null | undefined;
34fb726d48Sopenharmony_ci  private nodataPro: TableNoData | null | undefined;
35fb726d48Sopenharmony_ci  private processRunTimeData: Array<Top10RunTimeData> = [];
36fb726d48Sopenharmony_ci  private threadRunTimeData: Array<Top10RunTimeData> = [];
37fb726d48Sopenharmony_ci  private processSwitchCountChart: LitChartColumn | null | undefined;
38fb726d48Sopenharmony_ci  private threadSwitchCountChart: LitChartColumn | null | undefined;
39fb726d48Sopenharmony_ci  private nodataThr: TableNoData | null | undefined;
40fb726d48Sopenharmony_ci  private display_pro: HTMLDivElement | null | undefined;
41fb726d48Sopenharmony_ci  private display_thr: HTMLDivElement | null | undefined;
42fb726d48Sopenharmony_ci  private processId: number | undefined;
43fb726d48Sopenharmony_ci  private display_flag: boolean = true;
44fb726d48Sopenharmony_ci  private back: HTMLDivElement | null | undefined;
45fb726d48Sopenharmony_ci  private processMap: Map<number, string> = new Map();
46fb726d48Sopenharmony_ci  private threadMap: Map<number, string> = new Map();
47fb726d48Sopenharmony_ci
48fb726d48Sopenharmony_ci  /**
49fb726d48Sopenharmony_ci   * 初始化操作,若trace发生改变,将所有变量设置为默认值并重新请求数据。若trace未改变,跳出初始化
50fb726d48Sopenharmony_ci   */
51fb726d48Sopenharmony_ci  init(): void {
52fb726d48Sopenharmony_ci    if (!this.traceChange) {
53fb726d48Sopenharmony_ci      if (this.processRunTimeTbl!.recycleDataSource.length > 0) {
54fb726d48Sopenharmony_ci        this.processRunTimeTbl?.reMeauseHeight();
55fb726d48Sopenharmony_ci      }
56fb726d48Sopenharmony_ci      return;
57fb726d48Sopenharmony_ci    }
58fb726d48Sopenharmony_ci    this.traceChange = false;
59fb726d48Sopenharmony_ci    this.processRunTimeProgress!.loading = true;
60fb726d48Sopenharmony_ci    this.display_flag = true;
61fb726d48Sopenharmony_ci    this.display_pro!.style.display = 'block';
62fb726d48Sopenharmony_ci    this.display_thr!.style.display = 'none';
63fb726d48Sopenharmony_ci    this.processMap = Utils.getInstance().getProcessMap();
64fb726d48Sopenharmony_ci    this.threadMap = Utils.getInstance().getThreadMap();
65fb726d48Sopenharmony_ci    this.queryLogicWorker(
66fb726d48Sopenharmony_ci      'scheduling-Process Top10RunTime',
67fb726d48Sopenharmony_ci      'query Process Top10 Run Time Analysis Time:',
68fb726d48Sopenharmony_ci      this.callBack.bind(this)
69fb726d48Sopenharmony_ci    );
70fb726d48Sopenharmony_ci  }
71fb726d48Sopenharmony_ci
72fb726d48Sopenharmony_ci  /**
73fb726d48Sopenharmony_ci   * 清除已存储数据
74fb726d48Sopenharmony_ci   */
75fb726d48Sopenharmony_ci  clearData(): void {
76fb726d48Sopenharmony_ci    this.traceChange = true;
77fb726d48Sopenharmony_ci    this.processSwitchCountChart!.dataSource = [];
78fb726d48Sopenharmony_ci    this.processRunTimeTbl!.recycleDataSource = [];
79fb726d48Sopenharmony_ci    this.threadSwitchCountChart!.dataSource = [];
80fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.recycleDataSource = [];
81fb726d48Sopenharmony_ci    this.processRunTimeData = [];
82fb726d48Sopenharmony_ci    this.threadRunTimeData = [];
83fb726d48Sopenharmony_ci    this.processMap = new Map();
84fb726d48Sopenharmony_ci    this.threadMap = new Map();
85fb726d48Sopenharmony_ci  }
86fb726d48Sopenharmony_ci
87fb726d48Sopenharmony_ci  /**
88fb726d48Sopenharmony_ci   * 提交worker线程,进行数据库查询
89fb726d48Sopenharmony_ci   * @param option 操作的key值,用于找到并执行对应方法
90fb726d48Sopenharmony_ci   * @param log 日志打印内容
91fb726d48Sopenharmony_ci   * @param handler 结果回调函数
92fb726d48Sopenharmony_ci   * @param pid 需要查询某一进程下线程数据的进程id
93fb726d48Sopenharmony_ci   */
94fb726d48Sopenharmony_ci  queryLogicWorker(option: string, log: string, handler: (res: Array<Top10RunTimeData>) => void, pid?: number): void {
95fb726d48Sopenharmony_ci    let processThreadCountTime = new Date().getTime();
96fb726d48Sopenharmony_ci    procedurePool.submitWithName('logic0', option, { pid: pid }, undefined, handler);
97fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - processThreadCountTime;
98fb726d48Sopenharmony_ci    info(log, durTime);
99fb726d48Sopenharmony_ci  }
100fb726d48Sopenharmony_ci
101fb726d48Sopenharmony_ci  /**
102fb726d48Sopenharmony_ci   * 提交worker线程,进行数据库查询
103fb726d48Sopenharmony_ci   * @param option 操作的key值,用于找到并执行对应方法
104fb726d48Sopenharmony_ci   * @param log 日志打印内容
105fb726d48Sopenharmony_ci   * @param handler 结果回调函数
106fb726d48Sopenharmony_ci   * @param pid 需要查询某一进程下线程数据的进程id
107fb726d48Sopenharmony_ci   */
108fb726d48Sopenharmony_ci  organizationData(arr: Array<Top10RunTimeData>): Array<Top10RunTimeData> {
109fb726d48Sopenharmony_ci    let result: Array<Top10RunTimeData> = [];
110fb726d48Sopenharmony_ci    for (let i = 0; i < arr.length; i++) {
111fb726d48Sopenharmony_ci      const pStr: string | null = this.processMap.get(arr[i].pid!)!;
112fb726d48Sopenharmony_ci      const tStr: string | null = this.threadMap.get(arr[i].tid!)!;
113fb726d48Sopenharmony_ci      result.push({
114fb726d48Sopenharmony_ci        no: i + 1,
115fb726d48Sopenharmony_ci        pid: arr[i].pid || this.processId,
116fb726d48Sopenharmony_ci        pName: pStr === null ? 'Process ' : pStr,
117fb726d48Sopenharmony_ci        dur: arr[i].dur,
118fb726d48Sopenharmony_ci        tid: arr[i].tid,
119fb726d48Sopenharmony_ci        tName: tStr === null ? 'Thread ' : tStr
120fb726d48Sopenharmony_ci      });
121fb726d48Sopenharmony_ci    }
122fb726d48Sopenharmony_ci    return result;
123fb726d48Sopenharmony_ci  }
124fb726d48Sopenharmony_ci
125fb726d48Sopenharmony_ci  /**
126fb726d48Sopenharmony_ci   * 提交线程后,结果返回后的回调函数
127fb726d48Sopenharmony_ci   * @param res 数据库查询结果
128fb726d48Sopenharmony_ci   */
129fb726d48Sopenharmony_ci  callBack(res: Array<Top10RunTimeData>): void {
130fb726d48Sopenharmony_ci    let result: Array<Top10RunTimeData> = this.organizationData(res);
131fb726d48Sopenharmony_ci    if (this.display_flag === true) {
132fb726d48Sopenharmony_ci      this.processCallback(result);
133fb726d48Sopenharmony_ci    } else {
134fb726d48Sopenharmony_ci      this.threadCallback(result);
135fb726d48Sopenharmony_ci    }
136fb726d48Sopenharmony_ci    this.processRunTimeProgress!.loading = false;
137fb726d48Sopenharmony_ci  }
138fb726d48Sopenharmony_ci
139fb726d48Sopenharmony_ci  /**
140fb726d48Sopenharmony_ci   * 大函数块拆解分为两部分,此部分为Top10进程数据
141fb726d48Sopenharmony_ci   * @param result 需要显示在表格中的数据
142fb726d48Sopenharmony_ci   */
143fb726d48Sopenharmony_ci  processCallback(result: Array<Top10RunTimeData>): void {
144fb726d48Sopenharmony_ci    this.nodataPro!.noData = result === undefined || result.length === 0;
145fb726d48Sopenharmony_ci    this.processRunTimeTbl!.recycleDataSource = result;
146fb726d48Sopenharmony_ci    this.processRunTimeTbl!.reMeauseHeight();
147fb726d48Sopenharmony_ci    this.processRunTimeData = result;
148fb726d48Sopenharmony_ci    this.processSwitchCountChart!.config = {
149fb726d48Sopenharmony_ci      data: result,
150fb726d48Sopenharmony_ci      appendPadding: 10,
151fb726d48Sopenharmony_ci      xField: 'pid',
152fb726d48Sopenharmony_ci      yField: 'dur',
153fb726d48Sopenharmony_ci      seriesField: 'size',
154fb726d48Sopenharmony_ci      color: (a): string => {
155fb726d48Sopenharmony_ci        return '#0a59f7';
156fb726d48Sopenharmony_ci      },
157fb726d48Sopenharmony_ci      hoverHandler: (no): void => {
158fb726d48Sopenharmony_ci        let data: unknown = result.find((it) => it.no === no);
159fb726d48Sopenharmony_ci        if (data) {
160fb726d48Sopenharmony_ci          // @ts-ignore
161fb726d48Sopenharmony_ci          data.isHover = true;
162fb726d48Sopenharmony_ci          this.processRunTimeTbl!.setCurrentHover(data);
163fb726d48Sopenharmony_ci        } else {
164fb726d48Sopenharmony_ci          this.processRunTimeTbl!.mouseOut();
165fb726d48Sopenharmony_ci        }
166fb726d48Sopenharmony_ci      },
167fb726d48Sopenharmony_ci      tip: (obj): string => {
168fb726d48Sopenharmony_ci        return `
169fb726d48Sopenharmony_ci          <div>
170fb726d48Sopenharmony_ci            <div>Process_Id:${
171fb726d48Sopenharmony_ci          // @ts-ignore
172fb726d48Sopenharmony_ci          obj[0].obj.pid}</div> 
173fb726d48Sopenharmony_ci            <div>Process_Name:${
174fb726d48Sopenharmony_ci          // @ts-ignore
175fb726d48Sopenharmony_ci          obj[0].obj.pName}</div> 
176fb726d48Sopenharmony_ci            <div>Run_Time:${
177fb726d48Sopenharmony_ci          // @ts-ignore
178fb726d48Sopenharmony_ci          obj[0].obj.dur}</div> 
179fb726d48Sopenharmony_ci          </div>
180fb726d48Sopenharmony_ci        `;
181fb726d48Sopenharmony_ci      },
182fb726d48Sopenharmony_ci      label: null,
183fb726d48Sopenharmony_ci    };
184fb726d48Sopenharmony_ci  }
185fb726d48Sopenharmony_ci
186fb726d48Sopenharmony_ci  /**
187fb726d48Sopenharmony_ci   * 大函数块拆解分为两部分,此部分为Top10线程数据
188fb726d48Sopenharmony_ci   * @param result 需要显示在表格中的数据
189fb726d48Sopenharmony_ci   */
190fb726d48Sopenharmony_ci  threadCallback(result: Array<Top10RunTimeData>): void {
191fb726d48Sopenharmony_ci    this.nodataThr!.noData = result === undefined || result.length === 0;
192fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.recycleDataSource = result;
193fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.reMeauseHeight();
194fb726d48Sopenharmony_ci    this.threadRunTimeData = result;
195fb726d48Sopenharmony_ci    this.threadSwitchCountChart!.config = {
196fb726d48Sopenharmony_ci      data: result,
197fb726d48Sopenharmony_ci      appendPadding: 10,
198fb726d48Sopenharmony_ci      xField: 'tid',
199fb726d48Sopenharmony_ci      yField: 'dur',
200fb726d48Sopenharmony_ci      seriesField: 'size',
201fb726d48Sopenharmony_ci      color: (a): string => {
202fb726d48Sopenharmony_ci        return '#0a59f7';
203fb726d48Sopenharmony_ci      },
204fb726d48Sopenharmony_ci      hoverHandler: (no): void => {
205fb726d48Sopenharmony_ci        let data: unknown = result.find((it) => it.no === no);
206fb726d48Sopenharmony_ci        if (data) {
207fb726d48Sopenharmony_ci          // @ts-ignore
208fb726d48Sopenharmony_ci          data.isHover = true;
209fb726d48Sopenharmony_ci          this.threadRunTimeTbl!.setCurrentHover(data);
210fb726d48Sopenharmony_ci        } else {
211fb726d48Sopenharmony_ci          this.threadRunTimeTbl!.mouseOut();
212fb726d48Sopenharmony_ci        }
213fb726d48Sopenharmony_ci      },
214fb726d48Sopenharmony_ci      tip: (obj): string => {
215fb726d48Sopenharmony_ci        return `
216fb726d48Sopenharmony_ci          <div>
217fb726d48Sopenharmony_ci            <div>Process_Id:${
218fb726d48Sopenharmony_ci          // @ts-ignore
219fb726d48Sopenharmony_ci          obj[0].obj.pid}</div> 
220fb726d48Sopenharmony_ci            <div>Thread_Id:${
221fb726d48Sopenharmony_ci          // @ts-ignore
222fb726d48Sopenharmony_ci          obj[0].obj.tid}</div> 
223fb726d48Sopenharmony_ci            <div>Thread_Name:${
224fb726d48Sopenharmony_ci          // @ts-ignore
225fb726d48Sopenharmony_ci          obj[0].obj.tName}</div> 
226fb726d48Sopenharmony_ci            <div>Run_Time:${
227fb726d48Sopenharmony_ci          // @ts-ignore
228fb726d48Sopenharmony_ci          obj[0].obj.dur}</div> 
229fb726d48Sopenharmony_ci          </div>
230fb726d48Sopenharmony_ci        `;
231fb726d48Sopenharmony_ci      },
232fb726d48Sopenharmony_ci      label: null,
233fb726d48Sopenharmony_ci    };
234fb726d48Sopenharmony_ci  }
235fb726d48Sopenharmony_ci
236fb726d48Sopenharmony_ci  /**
237fb726d48Sopenharmony_ci   * 元素初始化,将html节点与内部变量进行绑定
238fb726d48Sopenharmony_ci   */
239fb726d48Sopenharmony_ci  initElements(): void {
240fb726d48Sopenharmony_ci    this.processRunTimeProgress = this.shadowRoot!.querySelector<LitProgressBar>('#loading');
241fb726d48Sopenharmony_ci    this.nodataPro = this.shadowRoot!.querySelector<TableNoData>('#nodata_Pro');
242fb726d48Sopenharmony_ci    this.processRunTimeTbl = this.shadowRoot!.querySelector<LitTable>('#tb-process-run-time');
243fb726d48Sopenharmony_ci    this.processSwitchCountChart = this.shadowRoot!.querySelector<LitChartColumn>('#chart_pro');
244fb726d48Sopenharmony_ci    this.nodataThr = this.shadowRoot!.querySelector<TableNoData>('#nodata_Thr');
245fb726d48Sopenharmony_ci    this.threadRunTimeTbl = this.shadowRoot!.querySelector<LitTable>('#tb-thread-run-time');
246fb726d48Sopenharmony_ci    this.threadSwitchCountChart = this.shadowRoot!.querySelector<LitChartColumn>('#chart_thr');
247fb726d48Sopenharmony_ci    this.display_pro = this.shadowRoot!.querySelector<HTMLDivElement>('#display_pro');
248fb726d48Sopenharmony_ci    this.display_thr = this.shadowRoot!.querySelector<HTMLDivElement>('#display_thr');
249fb726d48Sopenharmony_ci    this.back = this.shadowRoot!.querySelector<HTMLDivElement>('#back');
250fb726d48Sopenharmony_ci    this.clickEventListener();
251fb726d48Sopenharmony_ci    this.hoverEventListener();
252fb726d48Sopenharmony_ci  }
253fb726d48Sopenharmony_ci
254fb726d48Sopenharmony_ci  /**
255fb726d48Sopenharmony_ci   * 点击监听事件函数块
256fb726d48Sopenharmony_ci   */
257fb726d48Sopenharmony_ci  clickEventListener(): void {
258fb726d48Sopenharmony_ci    // @ts-ignore
259fb726d48Sopenharmony_ci    this.processRunTimeTbl!.addEventListener('row-click', (evt: CustomEvent) => {
260fb726d48Sopenharmony_ci      this.display_flag = false;
261fb726d48Sopenharmony_ci      let data = evt.detail.data;
262fb726d48Sopenharmony_ci      this.processId = data.pid;
263fb726d48Sopenharmony_ci      this.display_thr!.style.display = 'block';
264fb726d48Sopenharmony_ci      this.display_pro!.style.display = 'none';
265fb726d48Sopenharmony_ci      this.queryLogicWorker(
266fb726d48Sopenharmony_ci        'scheduling-Process Top10RunTime',
267fb726d48Sopenharmony_ci        'query Thread Top10 Run Time Analysis Time:',
268fb726d48Sopenharmony_ci        this.callBack.bind(this),
269fb726d48Sopenharmony_ci        data.pid
270fb726d48Sopenharmony_ci      );
271fb726d48Sopenharmony_ci    });
272fb726d48Sopenharmony_ci    this.processRunTimeTbl!.addEventListener('column-click', (evt) => {
273fb726d48Sopenharmony_ci      // @ts-ignore
274fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail, this.processRunTimeData);
275fb726d48Sopenharmony_ci      this.processRunTimeTbl!.recycleDataSource = this.processRunTimeData;
276fb726d48Sopenharmony_ci    });
277fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.addEventListener('column-click', (evt) => {
278fb726d48Sopenharmony_ci      // @ts-ignore
279fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail, this.threadRunTimeData);
280fb726d48Sopenharmony_ci      this.threadRunTimeTbl!.recycleDataSource = this.threadRunTimeData;
281fb726d48Sopenharmony_ci    });
282fb726d48Sopenharmony_ci    this.processRunTimeTbl!.addEventListener('contextmenu', (ev) => { 
283fb726d48Sopenharmony_ci      ev.preventDefault();
284fb726d48Sopenharmony_ci    });
285fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.addEventListener('contextmenu', (ev) => {
286fb726d48Sopenharmony_ci      ev.preventDefault();
287fb726d48Sopenharmony_ci    });
288fb726d48Sopenharmony_ci    this.back?.addEventListener('click', (event) => {
289fb726d48Sopenharmony_ci      this.display_flag = true;
290fb726d48Sopenharmony_ci      this.display_pro!.style.display = 'block';
291fb726d48Sopenharmony_ci      this.display_thr!.style.display = 'none';
292fb726d48Sopenharmony_ci    });
293fb726d48Sopenharmony_ci  }
294fb726d48Sopenharmony_ci
295fb726d48Sopenharmony_ci  /**
296fb726d48Sopenharmony_ci   * 移入事件监听函数块
297fb726d48Sopenharmony_ci   */
298fb726d48Sopenharmony_ci  hoverEventListener(): void {
299fb726d48Sopenharmony_ci    // @ts-ignore
300fb726d48Sopenharmony_ci    this.processRunTimeTbl!.addEventListener('row-hover', (evt: CustomEvent) => {
301fb726d48Sopenharmony_ci      if (evt.detail.data) {
302fb726d48Sopenharmony_ci        let data = evt.detail.data;
303fb726d48Sopenharmony_ci        data.isHover = true;
304fb726d48Sopenharmony_ci        if (evt.detail.callBack) {
305fb726d48Sopenharmony_ci          evt.detail.callBack(true);
306fb726d48Sopenharmony_ci        }
307fb726d48Sopenharmony_ci        this.processSwitchCountChart?.showHoverColumn(data.no);
308fb726d48Sopenharmony_ci      }
309fb726d48Sopenharmony_ci    });
310fb726d48Sopenharmony_ci    // @ts-ignore
311fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.addEventListener('row-hover', (evt: CustomEvent) => {
312fb726d48Sopenharmony_ci      if (evt.detail.data) {
313fb726d48Sopenharmony_ci        let data = evt.detail.data;
314fb726d48Sopenharmony_ci        data.isHover = true;
315fb726d48Sopenharmony_ci        if (evt.detail.callBack) {
316fb726d48Sopenharmony_ci          evt.detail.callBack(true);
317fb726d48Sopenharmony_ci        }
318fb726d48Sopenharmony_ci        this.threadSwitchCountChart?.showHoverColumn(data.no);
319fb726d48Sopenharmony_ci      }
320fb726d48Sopenharmony_ci    });
321fb726d48Sopenharmony_ci  }
322fb726d48Sopenharmony_ci
323fb726d48Sopenharmony_ci  /**
324fb726d48Sopenharmony_ci   * 表格数据排序
325fb726d48Sopenharmony_ci   * @param detail 点击的列名,以及排序状态0 1 2分别代表不排序、升序排序、降序排序
326fb726d48Sopenharmony_ci   * @param data 表格中需要排序的数据
327fb726d48Sopenharmony_ci   */
328fb726d48Sopenharmony_ci  sortByColumn(detail: unknown, data: Array<Top10RunTimeData>): void {
329fb726d48Sopenharmony_ci    // @ts-ignore
330fb726d48Sopenharmony_ci    function compare(processThreadCountProperty, sort, type) {
331fb726d48Sopenharmony_ci      return function (a: unknown, b: unknown) {
332fb726d48Sopenharmony_ci        if (type === 'number') {
333fb726d48Sopenharmony_ci          // @ts-ignore
334fb726d48Sopenharmony_ci          return sort === 2
335fb726d48Sopenharmony_ci          // @ts-ignore
336fb726d48Sopenharmony_ci            ? parseFloat(b[processThreadCountProperty]) -
337fb726d48Sopenharmony_ci            // @ts-ignore
338fb726d48Sopenharmony_ci            parseFloat(a[processThreadCountProperty])
339fb726d48Sopenharmony_ci            // @ts-ignore
340fb726d48Sopenharmony_ci            : parseFloat(a[processThreadCountProperty]) -
341fb726d48Sopenharmony_ci            // @ts-ignore
342fb726d48Sopenharmony_ci            parseFloat(b[processThreadCountProperty]);
343fb726d48Sopenharmony_ci        } else {
344fb726d48Sopenharmony_ci          if (sort === 2) {
345fb726d48Sopenharmony_ci            // @ts-ignore
346fb726d48Sopenharmony_ci            return b[processThreadCountProperty]
347fb726d48Sopenharmony_ci              .toString()
348fb726d48Sopenharmony_ci              // @ts-ignore
349fb726d48Sopenharmony_ci              .localeCompare(a[processThreadCountProperty].toString());
350fb726d48Sopenharmony_ci          } else {
351fb726d48Sopenharmony_ci            // @ts-ignore
352fb726d48Sopenharmony_ci            return a[processThreadCountProperty]
353fb726d48Sopenharmony_ci              .toString()
354fb726d48Sopenharmony_ci              // @ts-ignore
355fb726d48Sopenharmony_ci              .localeCompare(b[processThreadCountProperty].toString());
356fb726d48Sopenharmony_ci          }
357fb726d48Sopenharmony_ci        }
358fb726d48Sopenharmony_ci      };
359fb726d48Sopenharmony_ci    }
360fb726d48Sopenharmony_ci    // @ts-ignore
361fb726d48Sopenharmony_ci    if (detail.key === 'pName' || detail.key === 'tName') {
362fb726d48Sopenharmony_ci      data.sort(
363fb726d48Sopenharmony_ci        // @ts-ignore
364fb726d48Sopenharmony_ci        compare(detail.key, detail.sort, 'string')
365fb726d48Sopenharmony_ci      );
366fb726d48Sopenharmony_ci    } else {
367fb726d48Sopenharmony_ci      data.sort(
368fb726d48Sopenharmony_ci        // @ts-ignore
369fb726d48Sopenharmony_ci        compare(detail.key, detail.sort, 'number')
370fb726d48Sopenharmony_ci      );
371fb726d48Sopenharmony_ci    }
372fb726d48Sopenharmony_ci  }
373fb726d48Sopenharmony_ci
374fb726d48Sopenharmony_ci  /**
375fb726d48Sopenharmony_ci   * 用于将元素节点挂载,大函数块拆分为样式、节点
376fb726d48Sopenharmony_ci   * @returns 返回字符串形式的元素节点
377fb726d48Sopenharmony_ci   */
378fb726d48Sopenharmony_ci  initHtml(): string {
379fb726d48Sopenharmony_ci    return this.initStyleHtml() + this.initTagHtml();
380fb726d48Sopenharmony_ci  }
381fb726d48Sopenharmony_ci
382fb726d48Sopenharmony_ci  /**
383fb726d48Sopenharmony_ci   * 样式html代码块
384fb726d48Sopenharmony_ci   * @returns 返回样式代码块字符串
385fb726d48Sopenharmony_ci   */
386fb726d48Sopenharmony_ci  initStyleHtml(): string {
387fb726d48Sopenharmony_ci    return `
388fb726d48Sopenharmony_ci      <style>
389fb726d48Sopenharmony_ci        .content_grid{
390fb726d48Sopenharmony_ci            display: grid;
391fb726d48Sopenharmony_ci            padding: 15px;
392fb726d48Sopenharmony_ci            grid-column-gap: 15px;
393fb726d48Sopenharmony_ci            grid-row-gap: 15px;
394fb726d48Sopenharmony_ci            grid-template-columns: 1fr 1fr;
395fb726d48Sopenharmony_ci            background-color: var(--dark-background,#FFFFFF);
396fb726d48Sopenharmony_ci        }
397fb726d48Sopenharmony_ci        .chart_div{
398fb726d48Sopenharmony_ci            display: flex;
399fb726d48Sopenharmony_ci            flex-direction: column;
400fb726d48Sopenharmony_ci            background-color: var(--dark-background,#FFFFFF);
401fb726d48Sopenharmony_ci            align-items: center;
402fb726d48Sopenharmony_ci            height: 370px;
403fb726d48Sopenharmony_ci            padding-left: 5px;
404fb726d48Sopenharmony_ci            padding-right: 5px;
405fb726d48Sopenharmony_ci            border-radius: 5px
406fb726d48Sopenharmony_ci        }
407fb726d48Sopenharmony_ci        :host {
408fb726d48Sopenharmony_ci            width: 100%;
409fb726d48Sopenharmony_ci            height: 100%;
410fb726d48Sopenharmony_ci            background: var(--dark-background5,#F6F6F6);
411fb726d48Sopenharmony_ci        }
412fb726d48Sopenharmony_ci        .tb_run_time{
413fb726d48Sopenharmony_ci            overflow: auto;
414fb726d48Sopenharmony_ci            background-color: var(--dark-background,#FFFFFF);
415fb726d48Sopenharmony_ci            border-radius: 5px;
416fb726d48Sopenharmony_ci            border: solid 1px var(--dark-border1,#e0e0e0);
417fb726d48Sopenharmony_ci            display: flex;
418fb726d48Sopenharmony_ci        }
419fb726d48Sopenharmony_ci        .bg{
420fb726d48Sopenharmony_ci            background-color: var(--dark-background,#FFFFFF);
421fb726d48Sopenharmony_ci            padding-left: 10px;
422fb726d48Sopenharmony_ci        }
423fb726d48Sopenharmony_ci        .labels{
424fb726d48Sopenharmony_ci            display: flex;
425fb726d48Sopenharmony_ci            flex-direction: row;
426fb726d48Sopenharmony_ci            align-items: center;
427fb726d48Sopenharmony_ci            justify-content: center;
428fb726d48Sopenharmony_ci            font-size: 9pt;
429fb726d48Sopenharmony_ci            padding-right: 15px;
430fb726d48Sopenharmony_ci        }
431fb726d48Sopenharmony_ci      </style>
432fb726d48Sopenharmony_ci    `;
433fb726d48Sopenharmony_ci  }
434fb726d48Sopenharmony_ci
435fb726d48Sopenharmony_ci  /**
436fb726d48Sopenharmony_ci   * 节点html代码块
437fb726d48Sopenharmony_ci   * @returns 返回节点代码块字符串
438fb726d48Sopenharmony_ci   */
439fb726d48Sopenharmony_ci  initTagHtml(): string {
440fb726d48Sopenharmony_ci    return `
441fb726d48Sopenharmony_ci      <lit-progress-bar id="loading" style="height: 1px;width: 100%"></lit-progress-bar>
442fb726d48Sopenharmony_ci      <div id='display_pro'>
443fb726d48Sopenharmony_ci        <table-no-data id="nodata_Pro" contentHeight="500px">
444fb726d48Sopenharmony_ci          <div class="root">
445fb726d48Sopenharmony_ci            <div style="width:100%;height: 45px;"></div>
446fb726d48Sopenharmony_ci            <div class="content_grid" id="total">
447fb726d48Sopenharmony_ci              <div class="chart_div">
448fb726d48Sopenharmony_ci                <div style="line-height: 40px;height: 40px;width: 100%;text-align: center;">Top10运行超长进程</div>
449fb726d48Sopenharmony_ci                <lit-chart-column id="chart_pro" style="width:100%;height:300px"></lit-chart-column>
450fb726d48Sopenharmony_ci              </div>
451fb726d48Sopenharmony_ci              <div class="tb_run_time" >
452fb726d48Sopenharmony_ci                <lit-table id='tb-process-run-time' hideDownload style='height: auto'>
453fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='NO' data-index='no' key='no' align='flex-start' order></lit-table-column>
454fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Process_Id' data-index='pid' key='pid' align='flex-start' order></lit-table-column>
455fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Process_Name' data-index='pName' key='pName' align='flex-start' order></lit-table-column>
456fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Run_Time(ns)' data-index='dur' key='dur' align='flex-start' order></lit-table-column>        
457fb726d48Sopenharmony_ci                </lit-table>
458fb726d48Sopenharmony_ci              </div>
459fb726d48Sopenharmony_ci            </div>
460fb726d48Sopenharmony_ci          </div>
461fb726d48Sopenharmony_ci        </table-no-data>
462fb726d48Sopenharmony_ci      </div>
463fb726d48Sopenharmony_ci      <div id='display_thr' style='display: none'>
464fb726d48Sopenharmony_ci        <table-no-data id="nodata_Thr" contentHeight="500px">
465fb726d48Sopenharmony_ci          <div class="root">
466fb726d48Sopenharmony_ci            <div class="bg" style="display: flex;flex-direction: row;">
467fb726d48Sopenharmony_ci              <div id="back" style="height: 45px;display: flex;flex-direction: row;align-items: center;cursor: pointer" title="Back Previous Level">
468fb726d48Sopenharmony_ci                <span style="width: 10px"></span>Previous Level<span style="width: 10px"></span><lit-icon name="vertical-align-top" size="20"></lit-icon>
469fb726d48Sopenharmony_ci              </div>
470fb726d48Sopenharmony_ci            </div>
471fb726d48Sopenharmony_ci            <div class="content_grid" id="total">
472fb726d48Sopenharmony_ci              <div class="chart_div">
473fb726d48Sopenharmony_ci                <div style="line-height: 40px;height: 40px;width: 100%;text-align: center;">Top10运行超长线程</div>
474fb726d48Sopenharmony_ci                <lit-chart-column id="chart_thr" style="width:100%;height:300px"></lit-chart-column>
475fb726d48Sopenharmony_ci              </div>
476fb726d48Sopenharmony_ci              <div class="tb_run_time" >
477fb726d48Sopenharmony_ci                <lit-table id='tb-thread-run-time' hideDownload style='height: auto'>
478fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='NO' data-index='no' key='no' align='flex-start' order></lit-table-column>
479fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Process_Id' data-index='pid' key='pid' align='flex-start' order></lit-table-column>
480fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Thread_Id' data-index='tid' key='tid' align='flex-start' order></lit-table-column>
481fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Thread_Name' data-index='tName' key='tName' align='flex-start' order></lit-table-column>
482fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Run_Time(ns)' data-index='dur' key='dur' align='flex-start' order></lit-table-column>        
483fb726d48Sopenharmony_ci                </lit-table>
484fb726d48Sopenharmony_ci              </div>
485fb726d48Sopenharmony_ci            </div>
486fb726d48Sopenharmony_ci          </div>
487fb726d48Sopenharmony_ci        </table-no-data>
488fb726d48Sopenharmony_ci      </div>
489fb726d48Sopenharmony_ci    `;
490fb726d48Sopenharmony_ci  }
491fb726d48Sopenharmony_ci}
492fb726d48Sopenharmony_ci
493fb726d48Sopenharmony_ciinterface Top10RunTimeData {
494fb726d48Sopenharmony_ci  no?: number,
495fb726d48Sopenharmony_ci  pid?: number,
496fb726d48Sopenharmony_ci  tid?: number,
497fb726d48Sopenharmony_ci  pName?: string,
498fb726d48Sopenharmony_ci  tName?: string,
499fb726d48Sopenharmony_ci  switchCount?: number,
500fb726d48Sopenharmony_ci  dur?: number
501fb726d48Sopenharmony_ci}