【发布时间】:2017-08-28 06:57:20
【问题描述】:
我创建了一个按键事件,如果我按下按键“A”,它将执行功能 A()。A() 的过程将持续 2 秒。如果我像 4 次/2 秒那样快速按下键,我想等到每个过程完成。我测试发现,如果我在 4 次/2 秒内按键,它会首先在以后的按键事件中执行该过程。我如何才能等到每个过程在 keyevents 中完成?我必须尝试使用线程和互斥锁。但是有些不对劲。第一次用mutex,不知道怎么解决。
int g = 0;
void MainWindow::keyPressEvent(QKeyEvent *event)
{
int keyCode = event->key();
if(keyCode == Qt::Key_A) {
qDebug() << "da";
a->start();
}
}
void MyThread::run()// i try to block the second time process while press the key so quickly
{
mutex->lock();
...//process:last for 2s
g++;
mutex->unlock();
}
【问题讨论】:
-
你的线程应该做什么?我不明白你为什么需要一个线程。只需维护已启动进程的计数器。进程完成时使用
QProcess::finished信号通知。当您收到此类信号时减少计数器。当计数器达到 0 时,您将知道所有进程都已完成。虽然我不明白这一切有什么意义。如果您稍微解释一下您的程序,将会很有帮助。 -
我已经更新了代码。例如我想在A()中2s处理后更新g的值。但是,如果我这么快按下键,它就没有更新 g 并接收新的键事件并再次从第一行执行 A()。所以我想设置一个互斥锁来防止新事件的发生,并确保它可以通过 A() 并更新 g。但是代码不工作
-
为什么要在启动进程两秒后更新
g?为什么不能立即更新?您应该更详细地解释您要达到的目标,因为现在它没有任何意义。如果您想在进程运行时阻止某个键事件,只需在您的键事件中添加check the state of the process。 -
因为我已经设置了一个计时器,在更新之前使用 g 进行 2 秒的处理。所以我想把所有的keyevents保存在队列中,每2s一个一个地执行(等到进程完成再做下一步)
标签: c++ qt signals-slots