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 { LitChartPie } from '../../../../base-ui/chart/pie/LitChartPie';
25fb726d48Sopenharmony_ciimport '../../../../base-ui/chart/pie/LitChartPie';
26fb726d48Sopenharmony_ciimport { Utils } from '../../trace/base/Utils';
27fb726d48Sopenharmony_ci
28fb726d48Sopenharmony_ci@element('top10-process-switch-count')
29fb726d48Sopenharmony_ciexport class Top10ProcessSwitchCount extends BaseElement {
30fb726d48Sopenharmony_ci  traceChange: boolean = false;
31fb726d48Sopenharmony_ci  private processSwitchCountTbl: LitTable | null | undefined;
32fb726d48Sopenharmony_ci  private threadSwitchCountTbl: LitTable | null | undefined;
33fb726d48Sopenharmony_ci  private nodataPro: TableNoData | null | undefined;
34fb726d48Sopenharmony_ci  private nodataThr: TableNoData | null | undefined;
35fb726d48Sopenharmony_ci  private processSwitchCountData: Array<Top10ProcSwiCount> = [];
36fb726d48Sopenharmony_ci  private threadSwitchCountData: Array<Top10ProcSwiCount> = [];
37fb726d48Sopenharmony_ci  private threadSwitchCountPie: LitChartPie | null | undefined;
38fb726d48Sopenharmony_ci  private processSwitchCountPie: LitChartPie | null | undefined;
39fb726d48Sopenharmony_ci  private display_pro: HTMLDivElement | null | undefined;
40fb726d48Sopenharmony_ci  private display_thr: HTMLDivElement | null | undefined;
41fb726d48Sopenharmony_ci  private processSwitchCountProgress: LitProgressBar | 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.processSwitchCountTbl!.recycleDataSource.length > 0) {
54fb726d48Sopenharmony_ci        this.processSwitchCountTbl?.reMeauseHeight();
55fb726d48Sopenharmony_ci      }
56fb726d48Sopenharmony_ci      return;
57fb726d48Sopenharmony_ci    }
58fb726d48Sopenharmony_ci    this.traceChange = false;
59fb726d48Sopenharmony_ci    this.processSwitchCountProgress!.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 Top10Swicount',
67fb726d48Sopenharmony_ci      'query Process Top10 Switch Count 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.processSwitchCountPie!.dataSource = [];
78fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.recycleDataSource = [];
79fb726d48Sopenharmony_ci    this.threadSwitchCountPie!.dataSource = [];
80fb726d48Sopenharmony_ci    this.threadSwitchCountTbl!.recycleDataSource = [];
81fb726d48Sopenharmony_ci    this.processSwitchCountData = [];
82fb726d48Sopenharmony_ci    this.threadSwitchCountData = [];
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<Top10ProcSwiCount>) => 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   * 抽取公共方法,提取数据,用于展示到表格中
103fb726d48Sopenharmony_ci   * @param arr 数据库查询结果
104fb726d48Sopenharmony_ci   * @returns 整理好的数据,包含进程名,线程名等相关信息
105fb726d48Sopenharmony_ci   */
106fb726d48Sopenharmony_ci  organizationData(arr: Array<Top10ProcSwiCount>): Array<Top10ProcSwiCount> {
107fb726d48Sopenharmony_ci    let result: Array<Top10ProcSwiCount> = [];
108fb726d48Sopenharmony_ci    for (let i = 0; i < arr.length; i++) {
109fb726d48Sopenharmony_ci      const pStr: string | null = this.processMap.get(arr[i].pid!)!;
110fb726d48Sopenharmony_ci      const tStr: string | null = this.threadMap.get(arr[i].tid!)!;
111fb726d48Sopenharmony_ci      result.push({
112fb726d48Sopenharmony_ci        NO: i + 1,
113fb726d48Sopenharmony_ci        pid: arr[i].pid || this.processId,
114fb726d48Sopenharmony_ci        pName: pStr === null ? 'Process ' : pStr,
115fb726d48Sopenharmony_ci        switchCount: arr[i].occurrences,
116fb726d48Sopenharmony_ci        tid: arr[i].tid,
117fb726d48Sopenharmony_ci        tName: tStr === null ? 'Thread ' : tStr
118fb726d48Sopenharmony_ci      });
119fb726d48Sopenharmony_ci    }
120fb726d48Sopenharmony_ci    return result;
121fb726d48Sopenharmony_ci  }
122fb726d48Sopenharmony_ci
123fb726d48Sopenharmony_ci  /**
124fb726d48Sopenharmony_ci   * 提交线程后,结果返回后的回调函数
125fb726d48Sopenharmony_ci   * @param res 数据库查询结果
126fb726d48Sopenharmony_ci   */
127fb726d48Sopenharmony_ci  callBack(res: Array<Top10ProcSwiCount>): void {
128fb726d48Sopenharmony_ci    let result: Array<Top10ProcSwiCount> = this.organizationData(res);
129fb726d48Sopenharmony_ci    // 判断当前显示的是进程组还是线程组
130fb726d48Sopenharmony_ci    if (this.display_flag === true) {
131fb726d48Sopenharmony_ci      this.processCallback(result);
132fb726d48Sopenharmony_ci    } else {
133fb726d48Sopenharmony_ci      this.threadCallback(result);
134fb726d48Sopenharmony_ci    }
135fb726d48Sopenharmony_ci    this.processSwitchCountProgress!.loading = false;
136fb726d48Sopenharmony_ci  }
137fb726d48Sopenharmony_ci
138fb726d48Sopenharmony_ci  /**
139fb726d48Sopenharmony_ci   * 大函数块拆解分为两部分,此部分为Top10进程数据
140fb726d48Sopenharmony_ci   * @param result 需要显示在表格中的数据
141fb726d48Sopenharmony_ci   */
142fb726d48Sopenharmony_ci  processCallback(result: Array<Top10ProcSwiCount>): void {
143fb726d48Sopenharmony_ci    this.nodataPro!.noData = result === undefined || result.length === 0;
144fb726d48Sopenharmony_ci    this.processSwitchCountData = result;
145fb726d48Sopenharmony_ci    this.processSwitchCountPie!.config = {
146fb726d48Sopenharmony_ci      appendPadding: 10,
147fb726d48Sopenharmony_ci      data: result,
148fb726d48Sopenharmony_ci      angleField: 'switchCount',
149fb726d48Sopenharmony_ci      colorField: 'pid',
150fb726d48Sopenharmony_ci      radius: 0.8,
151fb726d48Sopenharmony_ci      label: {
152fb726d48Sopenharmony_ci        type: 'outer',
153fb726d48Sopenharmony_ci      },
154fb726d48Sopenharmony_ci      hoverHandler: (data): void => {
155fb726d48Sopenharmony_ci        if (data) {
156fb726d48Sopenharmony_ci          this.processSwitchCountTbl!.setCurrentHover(data);
157fb726d48Sopenharmony_ci        } else {
158fb726d48Sopenharmony_ci          this.processSwitchCountTbl!.mouseOut();
159fb726d48Sopenharmony_ci        }
160fb726d48Sopenharmony_ci      },
161fb726d48Sopenharmony_ci      tip: (obj): string => {
162fb726d48Sopenharmony_ci        return `
163fb726d48Sopenharmony_ci          <div>
164fb726d48Sopenharmony_ci            <div>Process_Id:${
165fb726d48Sopenharmony_ci          // @ts-ignore
166fb726d48Sopenharmony_ci          obj.obj.pid}</div> 
167fb726d48Sopenharmony_ci            <div>Process_Name:${
168fb726d48Sopenharmony_ci          // @ts-ignore
169fb726d48Sopenharmony_ci          obj.obj.pName}</div> 
170fb726d48Sopenharmony_ci            <div>Switch Count:${
171fb726d48Sopenharmony_ci          // @ts-ignore
172fb726d48Sopenharmony_ci          obj.obj.switchCount}</div> 
173fb726d48Sopenharmony_ci          </div>
174fb726d48Sopenharmony_ci        `;
175fb726d48Sopenharmony_ci      },
176fb726d48Sopenharmony_ci      interactions: [
177fb726d48Sopenharmony_ci        {
178fb726d48Sopenharmony_ci          type: 'element-active',
179fb726d48Sopenharmony_ci        },
180fb726d48Sopenharmony_ci      ],
181fb726d48Sopenharmony_ci    };
182fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.recycleDataSource = result;
183fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.reMeauseHeight();
184fb726d48Sopenharmony_ci  }
185fb726d48Sopenharmony_ci
186fb726d48Sopenharmony_ci  /**
187fb726d48Sopenharmony_ci   * 大函数块拆解分为两部分,此部分为Top10线程数据
188fb726d48Sopenharmony_ci   * @param result 需要显示在表格中的数据
189fb726d48Sopenharmony_ci   */
190fb726d48Sopenharmony_ci  threadCallback(result: Array<Top10ProcSwiCount>): void {
191fb726d48Sopenharmony_ci    this.nodataThr!.noData = result === undefined || result.length === 0;
192fb726d48Sopenharmony_ci    this.threadSwitchCountTbl!.recycleDataSource = result;
193fb726d48Sopenharmony_ci    this.threadSwitchCountTbl!.reMeauseHeight();
194fb726d48Sopenharmony_ci    this.threadSwitchCountData = result;
195fb726d48Sopenharmony_ci    this.threadSwitchCountPie!.config = {
196fb726d48Sopenharmony_ci      appendPadding: 10,
197fb726d48Sopenharmony_ci      data: result,
198fb726d48Sopenharmony_ci      angleField: 'switchCount',
199fb726d48Sopenharmony_ci      colorField: 'tid',
200fb726d48Sopenharmony_ci      radius: 0.8,
201fb726d48Sopenharmony_ci      label: {
202fb726d48Sopenharmony_ci        type: 'outer',
203fb726d48Sopenharmony_ci      },
204fb726d48Sopenharmony_ci      hoverHandler: (data): void => {
205fb726d48Sopenharmony_ci        if (data) {
206fb726d48Sopenharmony_ci          this.threadSwitchCountTbl!.setCurrentHover(data);
207fb726d48Sopenharmony_ci        } else {
208fb726d48Sopenharmony_ci          this.threadSwitchCountTbl!.mouseOut();
209fb726d48Sopenharmony_ci        }
210fb726d48Sopenharmony_ci      },
211fb726d48Sopenharmony_ci      tip: (obj): string => {
212fb726d48Sopenharmony_ci        return `
213fb726d48Sopenharmony_ci          <div>
214fb726d48Sopenharmony_ci            <div>Thread_Id:${
215fb726d48Sopenharmony_ci          // @ts-ignore
216fb726d48Sopenharmony_ci          obj.obj.tid}</div> 
217fb726d48Sopenharmony_ci            <div>Thread_Name:${
218fb726d48Sopenharmony_ci          // @ts-ignore
219fb726d48Sopenharmony_ci          obj.obj.tName}</div> 
220fb726d48Sopenharmony_ci            <div>Switch Count:${
221fb726d48Sopenharmony_ci          // @ts-ignore
222fb726d48Sopenharmony_ci          obj.obj.switchCount}</div> 
223fb726d48Sopenharmony_ci            <div>Process_Id:${
224fb726d48Sopenharmony_ci          // @ts-ignore
225fb726d48Sopenharmony_ci          obj.obj.pid}</div> 
226fb726d48Sopenharmony_ci          </div>
227fb726d48Sopenharmony_ci        `;
228fb726d48Sopenharmony_ci      },
229fb726d48Sopenharmony_ci      interactions: [
230fb726d48Sopenharmony_ci        {
231fb726d48Sopenharmony_ci          type: 'element-active',
232fb726d48Sopenharmony_ci        },
233fb726d48Sopenharmony_ci      ],
234fb726d48Sopenharmony_ci    };
235fb726d48Sopenharmony_ci  }
236fb726d48Sopenharmony_ci
237fb726d48Sopenharmony_ci  /**
238fb726d48Sopenharmony_ci   * 元素初始化,将html节点与内部变量进行绑定
239fb726d48Sopenharmony_ci   */
240fb726d48Sopenharmony_ci  initElements(): void {
241fb726d48Sopenharmony_ci    this.processSwitchCountProgress = this.shadowRoot!.querySelector<LitProgressBar>('#loading');
242fb726d48Sopenharmony_ci    this.processSwitchCountTbl = this.shadowRoot!.querySelector<LitTable>('#tb-process-switch-count');
243fb726d48Sopenharmony_ci    this.threadSwitchCountTbl = this.shadowRoot!.querySelector<LitTable>('#tb-thread-switch-count');
244fb726d48Sopenharmony_ci    this.processSwitchCountPie = this.shadowRoot!.querySelector<LitChartPie>('#pie_pro');
245fb726d48Sopenharmony_ci    this.threadSwitchCountPie = this.shadowRoot!.querySelector<LitChartPie>('#pie_thr');
246fb726d48Sopenharmony_ci    this.nodataPro = this.shadowRoot!.querySelector<TableNoData>('#nodata_pro');
247fb726d48Sopenharmony_ci    this.nodataThr = this.shadowRoot!.querySelector<TableNoData>('#nodata_thr');
248fb726d48Sopenharmony_ci    this.display_pro = this.shadowRoot!.querySelector<HTMLDivElement>('#display_pro');
249fb726d48Sopenharmony_ci    this.display_thr = this.shadowRoot!.querySelector<HTMLDivElement>('#display_thr');
250fb726d48Sopenharmony_ci    this.back = this.shadowRoot!.querySelector<HTMLDivElement>('#back');
251fb726d48Sopenharmony_ci    this.clickEventListener();
252fb726d48Sopenharmony_ci    this.hoverEventListener();
253fb726d48Sopenharmony_ci    this.addEventListener('contextmenu', (event) => {
254fb726d48Sopenharmony_ci      event.preventDefault(); // 阻止默认的上下文菜单弹框
255fb726d48Sopenharmony_ci    });
256fb726d48Sopenharmony_ci  }
257fb726d48Sopenharmony_ci
258fb726d48Sopenharmony_ci  /**
259fb726d48Sopenharmony_ci   * 点击监听事件函数块
260fb726d48Sopenharmony_ci   */
261fb726d48Sopenharmony_ci  clickEventListener(): void {
262fb726d48Sopenharmony_ci    // @ts-ignore
263fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.addEventListener('row-click', (evt: CustomEvent) => {
264fb726d48Sopenharmony_ci      this.display_flag = false;
265fb726d48Sopenharmony_ci      let data = evt.detail.data;
266fb726d48Sopenharmony_ci      this.processId = data.pid;
267fb726d48Sopenharmony_ci      this.display_thr!.style.display = 'block';
268fb726d48Sopenharmony_ci      this.display_pro!.style.display = 'none';
269fb726d48Sopenharmony_ci      this.queryLogicWorker(
270fb726d48Sopenharmony_ci        'scheduling-Process Top10Swicount',
271fb726d48Sopenharmony_ci        'query Process Top10 Switch Count Analysis Time:',
272fb726d48Sopenharmony_ci        this.callBack.bind(this),
273fb726d48Sopenharmony_ci        data.pid
274fb726d48Sopenharmony_ci      );
275fb726d48Sopenharmony_ci    });
276fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.addEventListener('column-click', (evt) => {
277fb726d48Sopenharmony_ci      // @ts-ignore
278fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail, this.processSwitchCountData);
279fb726d48Sopenharmony_ci      this.processSwitchCountTbl!.recycleDataSource = this.processSwitchCountData;
280fb726d48Sopenharmony_ci    });
281fb726d48Sopenharmony_ci    this.threadSwitchCountTbl!.addEventListener('column-click', (evt) => {
282fb726d48Sopenharmony_ci      // @ts-ignore
283fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail, this.threadSwitchCountData);
284fb726d48Sopenharmony_ci      this.threadSwitchCountTbl!.recycleDataSource = this.threadSwitchCountData;
285fb726d48Sopenharmony_ci    });
286fb726d48Sopenharmony_ci    
287fb726d48Sopenharmony_ci    this.back!.addEventListener('click', (event) => {
288fb726d48Sopenharmony_ci      this.display_flag = true;
289fb726d48Sopenharmony_ci      this.display_pro!.style.display = 'block';
290fb726d48Sopenharmony_ci      this.display_thr!.style.display = 'none';
291fb726d48Sopenharmony_ci    });
292fb726d48Sopenharmony_ci
293fb726d48Sopenharmony_ci  }
294fb726d48Sopenharmony_ci
295fb726d48Sopenharmony_ci  /**
296fb726d48Sopenharmony_ci   * 移入事件监听函数块
297fb726d48Sopenharmony_ci   */
298fb726d48Sopenharmony_ci  hoverEventListener(): void {
299fb726d48Sopenharmony_ci    // @ts-ignore
300fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.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      }
308fb726d48Sopenharmony_ci      this.processSwitchCountPie?.showHover();
309fb726d48Sopenharmony_ci    });
310fb726d48Sopenharmony_ci    // @ts-ignore
311fb726d48Sopenharmony_ci    this.threadSwitchCountTbl!.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      }
319fb726d48Sopenharmony_ci      this.threadSwitchCountPie?.showHover();
320fb726d48Sopenharmony_ci    });
321fb726d48Sopenharmony_ci    this.addEventListener('mouseenter', () => {
322fb726d48Sopenharmony_ci      if (this.processSwitchCountTbl!.recycleDataSource.length > 0) {
323fb726d48Sopenharmony_ci        this.processSwitchCountTbl?.reMeauseHeight();
324fb726d48Sopenharmony_ci      }
325fb726d48Sopenharmony_ci    });
326fb726d48Sopenharmony_ci  }
327fb726d48Sopenharmony_ci
328fb726d48Sopenharmony_ci  /**
329fb726d48Sopenharmony_ci   * 表格数据排序
330fb726d48Sopenharmony_ci   * @param detail 点击的列名,以及排序状态0 1 2分别代表不排序、升序排序、降序排序
331fb726d48Sopenharmony_ci   * @param data 表格中需要排序的数据
332fb726d48Sopenharmony_ci   */
333fb726d48Sopenharmony_ci  sortByColumn(detail: { key: string, sort: number }, data: Array<Top10ProcSwiCount>): void {
334fb726d48Sopenharmony_ci    // @ts-ignore
335fb726d48Sopenharmony_ci    function compare(processThreadCountProperty, sort, type) {
336fb726d48Sopenharmony_ci      return function (a: unknown, b: unknown) {
337fb726d48Sopenharmony_ci        if (type === 'number') {
338fb726d48Sopenharmony_ci          // @ts-ignore
339fb726d48Sopenharmony_ci          return sort === 2
340fb726d48Sopenharmony_ci            // @ts-ignore
341fb726d48Sopenharmony_ci            ? parseFloat(b[processThreadCountProperty]) -
342fb726d48Sopenharmony_ci            // @ts-ignore
343fb726d48Sopenharmony_ci            parseFloat(a[processThreadCountProperty])
344fb726d48Sopenharmony_ci            // @ts-ignore
345fb726d48Sopenharmony_ci            : parseFloat(a[processThreadCountProperty]) -
346fb726d48Sopenharmony_ci            // @ts-ignore
347fb726d48Sopenharmony_ci            parseFloat(b[processThreadCountProperty]);
348fb726d48Sopenharmony_ci        } else {
349fb726d48Sopenharmony_ci          if (sort === 2) {
350fb726d48Sopenharmony_ci            // @ts-ignore
351fb726d48Sopenharmony_ci            return b[processThreadCountProperty]
352fb726d48Sopenharmony_ci              .toString()
353fb726d48Sopenharmony_ci              // @ts-ignore
354fb726d48Sopenharmony_ci              .localeCompare(a[processThreadCountProperty].toString());
355fb726d48Sopenharmony_ci          } else {
356fb726d48Sopenharmony_ci            // @ts-ignore
357fb726d48Sopenharmony_ci            return a[processThreadCountProperty]
358fb726d48Sopenharmony_ci              .toString()
359fb726d48Sopenharmony_ci              // @ts-ignore
360fb726d48Sopenharmony_ci              .localeCompare(b[processThreadCountProperty].toString());
361fb726d48Sopenharmony_ci          }
362fb726d48Sopenharmony_ci        }
363fb726d48Sopenharmony_ci      };
364fb726d48Sopenharmony_ci    }
365fb726d48Sopenharmony_ci    if (detail.key === 'pName' || detail.key === 'tName') {
366fb726d48Sopenharmony_ci      data.sort(
367fb726d48Sopenharmony_ci        compare(detail.key, detail.sort, 'string')
368fb726d48Sopenharmony_ci      );
369fb726d48Sopenharmony_ci    } else {
370fb726d48Sopenharmony_ci      data.sort(
371fb726d48Sopenharmony_ci        compare(detail.key, detail.sort, 'number')
372fb726d48Sopenharmony_ci      );
373fb726d48Sopenharmony_ci    }
374fb726d48Sopenharmony_ci  }
375fb726d48Sopenharmony_ci
376fb726d48Sopenharmony_ci  /**
377fb726d48Sopenharmony_ci   * 用于将元素节点挂载,大函数块拆分为样式、节点
378fb726d48Sopenharmony_ci   * @returns 返回字符串形式的元素节点
379fb726d48Sopenharmony_ci   */
380fb726d48Sopenharmony_ci  initHtml(): string {
381fb726d48Sopenharmony_ci    return this.initStyleHtml() + this.initTagHtml();
382fb726d48Sopenharmony_ci  }
383fb726d48Sopenharmony_ci
384fb726d48Sopenharmony_ci  /**
385fb726d48Sopenharmony_ci   * 样式html代码块
386fb726d48Sopenharmony_ci   * @returns 返回样式代码块字符串
387fb726d48Sopenharmony_ci   */
388fb726d48Sopenharmony_ci  initStyleHtml(): string {
389fb726d48Sopenharmony_ci    return `
390fb726d48Sopenharmony_ci      <style>
391fb726d48Sopenharmony_ci        :host {
392fb726d48Sopenharmony_ci            width: 100%;
393fb726d48Sopenharmony_ci            height: 100%;
394fb726d48Sopenharmony_ci            background-color: var(--dark-background5,#F6F6F6);
395fb726d48Sopenharmony_ci        }
396fb726d48Sopenharmony_ci        .pie-chart{
397fb726d48Sopenharmony_ci            display: flex;
398fb726d48Sopenharmony_ci            box-sizing: border-box;
399fb726d48Sopenharmony_ci            width: 500px;
400fb726d48Sopenharmony_ci            height: 500px;
401fb726d48Sopenharmony_ci        }
402fb726d48Sopenharmony_ci        .tb_switch_count{
403fb726d48Sopenharmony_ci            flex: 1;
404fb726d48Sopenharmony_ci            overflow: auto ;
405fb726d48Sopenharmony_ci            border-radius: 5px;
406fb726d48Sopenharmony_ci            border: solid 1px var(--dark-border1,#e0e0e0);
407fb726d48Sopenharmony_ci            margin: 15px;
408fb726d48Sopenharmony_ci            padding: 5px 15px
409fb726d48Sopenharmony_ci        }
410fb726d48Sopenharmony_ci        .switchcount-root{
411fb726d48Sopenharmony_ci            width: 100%;
412fb726d48Sopenharmony_ci            height: 100%;
413fb726d48Sopenharmony_ci            box-sizing: border-box;
414fb726d48Sopenharmony_ci            display: flex;
415fb726d48Sopenharmony_ci            flex-direction: row;
416fb726d48Sopenharmony_ci        }
417fb726d48Sopenharmony_ci        .bg{
418fb726d48Sopenharmony_ci            background-color: var(--dark-background,#FFFFFF);
419fb726d48Sopenharmony_ci            padding-left: 10px;
420fb726d48Sopenharmony_ci        }
421fb726d48Sopenharmony_ci      </style>
422fb726d48Sopenharmony_ci    `;
423fb726d48Sopenharmony_ci  }
424fb726d48Sopenharmony_ci
425fb726d48Sopenharmony_ci  /**
426fb726d48Sopenharmony_ci   * 节点html代码块
427fb726d48Sopenharmony_ci   * @returns 返回节点代码块字符串
428fb726d48Sopenharmony_ci   */
429fb726d48Sopenharmony_ci  initTagHtml(): string {
430fb726d48Sopenharmony_ci    return `
431fb726d48Sopenharmony_ci      <lit-progress-bar id='loading' style='height: 1px;width: 100%' loading></lit-progress-bar>
432fb726d48Sopenharmony_ci      <div id='display_pro'>
433fb726d48Sopenharmony_ci        <table-no-data id='nodata_pro' contentHeight='500px'>
434fb726d48Sopenharmony_ci          <div class="root">
435fb726d48Sopenharmony_ci            <div style="width:100%;height: 45px;"></div>
436fb726d48Sopenharmony_ci            <div class='switchcount-root'>
437fb726d48Sopenharmony_ci              <div style='display: flex;flex-direction: column;align-items: center'>
438fb726d48Sopenharmony_ci                <div>Statistics By Process's Switch Count</div>
439fb726d48Sopenharmony_ci                <lit-chart-pie id='pie_pro' class='pie-chart'></lit-chart-pie>
440fb726d48Sopenharmony_ci              </div>
441fb726d48Sopenharmony_ci              <div class='tb_switch_count'>
442fb726d48Sopenharmony_ci                <lit-table id='tb-process-switch-count' hideDownload style='height: auto'>
443fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='NO' data-index='NO' key='NO' align='flex-start' order></lit-table-column>
444fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Process_Id' data-index='pid' key='pid' align='flex-start' order></lit-table-column>
445fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Process_Name' data-index='pName' key='pName' align='flex-start' order></lit-table-column>
446fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Switch Count' data-index='switchCount' key='switchCount' align='flex-start' order></lit-table-column>        
447fb726d48Sopenharmony_ci                </lit-table>
448fb726d48Sopenharmony_ci              </div>
449fb726d48Sopenharmony_ci            </div>
450fb726d48Sopenharmony_ci          </div>
451fb726d48Sopenharmony_ci        </table-no-data>
452fb726d48Sopenharmony_ci      </div>
453fb726d48Sopenharmony_ci      <div id='display_thr' style='display: none'>
454fb726d48Sopenharmony_ci        <table-no-data id='nodata_thr' contentHeight='500px'>
455fb726d48Sopenharmony_ci          <div class="root">
456fb726d48Sopenharmony_ci            <div class="bg" style="display: flex;flex-direction: row;">
457fb726d48Sopenharmony_ci              <div id="back" style="height: 45px;display: flex;flex-direction: row;align-items: center;cursor: pointer" title="Back Previous Level">
458fb726d48Sopenharmony_ci                <span style="width: 10px"></span>Previous Level<span style="width: 10px"></span><lit-icon name="vertical-align-top" size="20"></lit-icon>
459fb726d48Sopenharmony_ci              </div>
460fb726d48Sopenharmony_ci            </div>
461fb726d48Sopenharmony_ci            <div class='switchcount-root'>
462fb726d48Sopenharmony_ci              <div style='display: flex;flex-direction: column;align-items: center'>
463fb726d48Sopenharmony_ci                <div>Statistics By Thread's Switch Count</div>
464fb726d48Sopenharmony_ci                <lit-chart-pie id='pie_thr' class='pie-chart'></lit-chart-pie>
465fb726d48Sopenharmony_ci              </div>
466fb726d48Sopenharmony_ci              <div class='tb_switch_count'>
467fb726d48Sopenharmony_ci                <lit-table id='tb-thread-switch-count' hideDownload style='height: auto'>
468fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='NO' data-index='NO' key='NO' align='flex-start' order></lit-table-column>
469fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Process_Id' data-index='pid' key='pid' align='flex-start' order></lit-table-column>
470fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Thread_Id' data-index='tid' key='tid' align='flex-start' order></lit-table-column>
471fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Thread_Name' data-index='tName' key='tName' align='flex-start' order></lit-table-column>
472fb726d48Sopenharmony_ci                  <lit-table-column width='1fr' title='Switch Count' data-index='switchCount' key='switchCount' align='flex-start' order></lit-table-column>        
473fb726d48Sopenharmony_ci                </lit-table>
474fb726d48Sopenharmony_ci              </div>
475fb726d48Sopenharmony_ci            </div>
476fb726d48Sopenharmony_ci          </div>
477fb726d48Sopenharmony_ci        </table-no-data>
478fb726d48Sopenharmony_ci      </div>
479fb726d48Sopenharmony_ci    `;
480fb726d48Sopenharmony_ci  }
481fb726d48Sopenharmony_ci}
482fb726d48Sopenharmony_ci
483fb726d48Sopenharmony_ciinterface Top10ProcSwiCount {
484fb726d48Sopenharmony_ci  NO?: number,
485fb726d48Sopenharmony_ci  pid?: number,
486fb726d48Sopenharmony_ci  tid?: number,
487fb726d48Sopenharmony_ci  pName?: string,
488fb726d48Sopenharmony_ci  tName?: string,
489fb726d48Sopenharmony_ci  switchCount?: number,
490fb726d48Sopenharmony_ci  occurrences?: number
491fb726d48Sopenharmony_ci}