| 170 | } |
| 171 | |
| 172 | void CProcessTable::Refresh() { |
| 173 | bool first = m_Table.data.info.empty(); |
| 174 | auto count = (int)m_ProcMgr.EnumProcessAndThreads(); |
| 175 | |
| 176 | if (first) { |
| 177 | m_Table.data.info = m_ProcMgr.GetProcesses(); |
| 178 | m_Table.data.n = count; |
| 179 | return; |
| 180 | } |
| 181 | |
| 182 | auto tick = ::GetTickCount64(); |
| 183 | count = (int)m_Table.data.info.size(); |
| 184 | for (int i = 0; i < count; i++) { |
| 185 | auto& p = m_Table.data.info[i]; |
| 186 | auto& px = GetProcessInfoEx(p.get()); |
| 187 | if (px.IsTerminated && tick > px.TargetTime) { |
| 188 | m_ProcessesEx.erase(p.get()); |
| 189 | m_Table.data.info.erase(m_Table.data.info.begin() + i); |
| 190 | i--; |
| 191 | count--; |
| 192 | continue; |
| 193 | } |
| 194 | if (px.IsNew && tick > px.TargetTime) { |
| 195 | px.IsNew = false; |
| 196 | } |
| 197 | } |
| 198 | |
| 199 | for (auto& p : m_ProcMgr.GetNewProcesses()) { |
| 200 | m_Table.data.info.push_back(p); |
| 201 | count++; |
| 202 | auto& px = GetProcessInfoEx(p.get()); |
| 203 | px.IsNew = true; |
| 204 | px.TargetTime = tick + 2000; |
| 205 | } |
| 206 | |
| 207 | for (auto& p : m_ProcMgr.GetTerminatedProcesses()) { |
| 208 | auto& px = GetProcessInfoEx(p.get()); |
| 209 | px.IsTerminated = true; |
| 210 | px.TargetTime = tick + 2000; |
| 211 | } |
| 212 | |
| 213 | m_Table.data.n = count; |
| 214 | |
| 215 | return; |
| 216 | } |
| 217 | |
| 218 | ProcessInfoEx& CProcessTable::GetProcessInfoEx(WinSys::ProcessInfo* pi) const { |
| 219 | auto it = m_ProcessesEx.find(pi); |
nothing calls this directly
no test coverage detected