gctl/lib/utility/process_monitor.cpp

122 lines
3.8 KiB
C++
Raw Permalink Normal View History

2024-09-14 15:13:50 +08:00
/********************************************************
*
*
*
*
*
*
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2023 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#include "process_monitor.h"
int scan_keyboard()
{
int in = 0;
struct termios new_settings;
struct termios stored_settings;
tcgetattr(0,&stored_settings);
new_settings = stored_settings;
new_settings.c_lflag &= (~ICANON);
new_settings.c_cc[VTIME] = 0;
tcgetattr(0,&stored_settings);
new_settings.c_cc[VMIN] = 1;
tcsetattr(0,TCSANOW,&new_settings);
in = getchar();
tcsetattr(0,TCSANOW,&stored_settings);
return in;
}
gctl::process_monitor::process_monitor()
{
end_process_ = false;
}
gctl::process_monitor::~process_monitor()
{
}
void gctl::process_monitor::set_end_process(bool ask)
{
if (ask)
{
std::string key;
std::cout << "Quit? (y/n): ";
std::cin >> key;
if (key == "y") end_process_ = true;
}
else
{
std::clog << "Press any key to quit.\n";
end_process_ = true;
}
return;
}
void gctl::process_monitor::start_monitoring()
{
// start a new thread for inversion
std::thread ttd = process_wapper();
// start the monitoring function
keyboard_actions();
// wait for the inversion to finish
ttd.join();
return;
}
2024-09-15 19:35:18 +08:00
void gctl::process_monitor::wait_for_kerboard(int sec)
2024-09-14 15:13:50 +08:00
{
2024-09-15 19:35:18 +08:00
// 键盘事件受到 keyboard_actions 的监控
std::cout << "Press 'p' to pause. Continue in " << sec << " seconds ..." << std::endl;
2024-09-14 15:13:50 +08:00
std::unique_lock<std::mutex> lck(mtx_); // 设置锁 等待监控函数的响应 如果超时则继续
2024-09-15 19:35:18 +08:00
if (cv_.wait_for(lck, std::chrono::seconds(sec)) == std::cv_status::timeout)
2024-09-14 15:13:50 +08:00
{
std::clog << "\x1b[1A\r\x1b[K";
}
return;
}
void gctl::process_monitor::keyboard_actions()
{
while (!end_process_)
{
int key_value = scan_keyboard();
std::string key_str;
if (key_value == 112) // p的键值为112
{
std::unique_lock<std::mutex> lck(mtx_);
2024-09-15 19:35:18 +08:00
// 这里可以设置额外的条件和命令
2024-09-14 15:13:50 +08:00
std::cout << "\rInput 'q' to quit: ";
std::cin >> key_str;
2024-09-15 19:35:18 +08:00
// 执行更多的命令
2024-09-14 15:17:48 +08:00
if (key_str == "q") set_end_process(true);
2024-09-14 15:13:50 +08:00
cv_.notify_one();
}
}
return;
}
bool gctl::process_monitor::end_process()
{
return end_process_;
}