Annotation of nono/wx/wxthreadmonitor.cpp, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2025 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // スレッドモニタ
                      9: //
                     10: 
                     11: #include "wxthreadmonitor.h"
                     12: #include "wxcolor.h"
                     13: #include "wxtextscreen.h"
                     14: #include "mainapp.h"
                     15: #include "thread.h"
                     16: 
                     17: 
                     18: // パネルには WXTextScreen 同様に四辺に DefaultPadding を手動で入れてある。
                     19: 
                     20: // イベントテーブル
                     21: wxBEGIN_EVENT_TABLE(WXThreadMonitorPanel, inherited)
                     22:        EVT_TIMER(wxID_ANY, WXThreadMonitorPanel::OnTimer)
                     23: wxEND_EVENT_TABLE()
                     24: 
                     25: // コンストラクタ
                     26: WXThreadMonitorPanel::WXThreadMonitorPanel(wxWindow *parent)
                     27:        : inherited(parent)
                     28: {
                     29:        SetName("ThreadMonitorPanel");
                     30: 
                     31:        thman = gMainApp.GetThreadManager();
                     32: 
                     33:        // スレッド数とスレッド名の長さはここで一度だけ取得?。
                     34:        {
                     35:                std::lock_guard<std::mutex> lock(thman->threads_mutex);
                     36: 
                     37:                nthreads = thman->threads.size();
                     38:                maxnamelen = 0;
                     39:                for (const auto& info : thman->threads) {
                     40:                        maxnamelen = std::max(maxnamelen, (uint)info.name.size());
                     41:                }
                     42:        }
                     43: 
                     44:        FontChanged();
                     45: 
                     46:        timer.SetOwner(this);
                     47:        timer.Start(500);
                     48: }
                     49: 
                     50: // デストラクタ
                     51: WXThreadMonitorPanel::~WXThreadMonitorPanel()
                     52: {
                     53: }
                     54: 
                     55: void
                     56: WXThreadMonitorPanel::FontChanged()
                     57: {
                     58:        constexpr int padding = WXTextScreen::DefaultPadding;
                     59: 
                     60:        inherited::FontChanged();
                     61: 
                     62:        uint cap = ThreadInfo::Capacity;
                     63:        wxSize size(
                     64:                (maxnamelen + 6) * font_width + cap * 2 + padding * 2,
                     65:                (nthreads * 2 + 1) * font_height + padding * 2);
                     66: 
                     67:        // バックバッファのサイズを固定
                     68:        SetMinBitmapSize(size);
                     69: 
                     70:        SetSize(size);
                     71:        SetMinSize(size);
                     72: 
                     73:        redraw_all = true;
                     74: }
                     75: 
                     76: void
                     77: WXThreadMonitorPanel::OnTimer(wxTimerEvent& event)
                     78: {
                     79:        Refresh();
                     80: }
                     81: 
                     82: void
                     83: WXThreadMonitorPanel::Draw()
                     84: {
                     85:        constexpr int padding = WXTextScreen::DefaultPadding;
                     86:        int y;
                     87:        int x;
                     88: 
                     89:        if (redraw_all) {
                     90:                Fill();
                     91:                redraw_all = false;
                     92: 
                     93:                y = 1;
                     94:                for (const auto& info : thman->threads) {
                     95:                        DrawStringSJIS(padding,
                     96:                                padding + y * font_height + font_height / 2,
                     97:                                info.name.c_str());
                     98:                        y += 2;
                     99:                }
                    100:        }
                    101:        x = maxnamelen + 1;
                    102: 
                    103:        // 現在値
                    104:        uint tx = padding + x * font_width;
                    105:        x += 5;
                    106:        // グラフの開始位置とサイズ
                    107:        uint gx = padding + x * font_width;
                    108:        uint gw = bitmap.GetWidth() - padding - gx;
                    109:        uint gh = font_height * 2 - 2;
                    110:        y = 1;
                    111:        for (const auto& info : thman->threads) {
                    112:                char numbuf[16];
                    113:                snprintf(numbuf, sizeof(numbuf), "%3u%%", info.load->PeekLatest());
                    114:                uint ty = padding + y * font_height + font_height / 2;
                    115:                DrawStringSJIS(tx, ty, numbuf);
                    116: 
                    117:                uint gy = padding + y * font_height;
                    118:                DrawGraph(gx, gy, gw, gh, info);
                    119:                y += 2;
                    120:        }
                    121: }
                    122: 
                    123: void
                    124: WXThreadMonitorPanel::DrawGraph(uint left, uint top, uint width, uint height,
                    125:        const ThreadInfo& info)
                    126: {
                    127:        bitmap.FillRect(UD_WHITE, left, top, width, height);
                    128: 
                    129:        uint cap = info.load->Capacity();
                    130:        uint len = info.load->Length();
                    131:        uint blank = cap - len;
                    132:        for (int t = 0; t < len; t++) {
                    133:                uint v = info.load->Peek(t);
                    134:                if (v != 0) {
                    135:                        uint ph = v * height / 100;
                    136:                        uint x0 = left + (blank + t) * 2;
                    137:                        uint y1 = top + height;
                    138:                        uint y0 = y1 - ph;
                    139:                        bitmap.FillRect(UD_GREEN, x0, y0, 2, ph);
                    140:                }
                    141:        }
                    142: }
                    143: 
                    144: 
                    145: //
                    146: // スレッドモニタウィンドウ
                    147: //
                    148: 
                    149: // コンストラクタ
                    150: WXThreadMonitorWindow::WXThreadMonitorWindow(wxWindow *parent)
                    151:        : inherited(parent, wxID_ANY, _("Thread Status"))
                    152: {
                    153:        new WXThreadMonitorPanel(this);
                    154:        Fit();
                    155: }
                    156: 
                    157: // デストラクタ
                    158: WXThreadMonitorWindow::~WXThreadMonitorWindow()
                    159: {
                    160: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.