需要有关gtkmm中多线程的帮助



我在线程方面不是很差,我需要帮助,

我有一个带有进度条的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

相关内容

  • 没有找到相关文章

最新更新