系统/软件详细信息: Qt版本4.7.4
Linux的 内核:2.6.31(为IMX25构建的自定义内核)
外围设备: 图形LCD(64x128) Quectel(M 12)GPRS模块 热敏打印机
数据库:Sqlite3
我是初学者,在Qt或使用Linux编程方面没有太多经验。我开发了一个应用程序,用户手动输入一些数据,并将数据保存在sqlite数据库中。所以我想要做的是,经过一段时间后,我们可以说数据库中的90秒数据应该通过GPRS传输到服务器。
所以我使用Qt的信号和插槽机制来进行定时数据传输。我创建了一个每90秒触发一次的插槽,当插槽被触发时,我正在创建/启动一个POSIX线程,假设将数据传输到服务器。
那么该线程的作用是启动“pppd”,一旦“pppd”启动它就会向数据库查询数据并将数据发送到服务器。一旦数据传输完成,我就杀了“pppd”。功能正常。
但问题是“pppd”需要时间才能启动,所以我不得不引入一些延迟。即12秒的睡眠是为了让pppd成功发射。但是当睡眠阻塞时,它会使主程序/线程无响应,直到“pppd”被启动(即它停止/停止所有活动,如打印等)。随着“pppd”的启动,主线程再次响应。
所以请建议我一些解决方案,以便在“pppd”启动时保持主线程响应,或者请建议我是否有相同的其他选择。如果我的方法有任何问题,请引导我。
提前致谢。如果我没有遵循你的标准,我很抱歉..
答案 0 :(得分:0)
您可以使用多种选择。看起来你正在使用一个线程,但后来在主线程中调用sleep,这与不使用线程来完成你的工作基本相同!您需要利用Qt
流程,如下所示:
您可以使用QProcess
start()
,并使用信号finished()
通知主线程它已完成。这可能是你想要使用的。您所要做的就是:
QProcess *proc = new QProcess;
proc->start("theProcess", QStringList() << "the" << "arguments");
connect(proc, SIGNAL(finished()), this, SLOT(someSlotToUse()));
这段代码将使用您的参数启动一个新进程,然后在进程完成时调用someSlotToUse()
。
您可以沿同一模式使用QThread
。
基本上,您要做的是在另一个线程中完成工作,保持GUI反应器可以自由处理GUI事件而不是长查询。这是Qt
中的一个经典问题,并且有很多文献。
或者,您可以使用QProcess::concurrent()
调用,它允许您在另一个进程中运行函数,但我从未测试过它。
以下是一些供您查看的参考资料:Qt Concurrent,QProcess和QThread