我在线程方面不是很差,我需要帮助,
我有一个带有进度条的gtkmm窗口,任务是在后台执行多个shell脚本或shell命令,并相应地更新进度条。我有
button->clicked_signal() {
thread( [this] { worker->start() } );
}
worker->start() {
{
lock_guard(mutex); // as per i know to safely handle variables
progress = 0.0
}
caller->notify(); // i found it on documentation that its for sending signal to window to refresh
int ret = WEXITSTATUS(system("./my_shell_script with-args"));
{
lock_guard(mutex);
progress = 0.4;
}
caller->notify(); // Simmilary i am handling more scripts
}
问题是"完成"窗口冻结,直到流程结束。它只发生在system((,如果我使用for loop((或其他函数,那么它不会冻结。
我试过其他方法。
worker->executor() {
int ret = WEXITSTATUS(system("./my_shell_script with-args"));
{
lock_guard(mutex);
progress = 0.4;
}
// other executions
}
worker->start() {
thread th1(&worker::executor, this);
while(true) {
caller->notify();
if (stop) break;
this_thread::sleep_for(chrono::milliseconds(120));
}
th1.join();
caller->notify();
}
但还是很冷。,我不擅长线程
完整的代码可在https://github.com/itsManjeet/opportunity.git分支(0.6.0(
他们有更好的方法来做这件事吗
除了主线程之外,您不能从任何线程进行任何GUI更改或使用任何其他GTK函数。例如,如果你需要更改进度条,那么你必须向主线程发出信号,而不是试图从工作线程进行更改。您可以为此使用Glib::Dispatcher
。