保持主线程(Qt应用程序)响应而其他一些线程正在处理(POSIX)

时间:2013-09-10 13:31:27

标签: linux multithreading qt posix pppd

系统/软件详细信息: 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”启动时保持主线程响应,或者请建议我是否有相同的其他选择。如果我的方法有任何问题,请引导我。

提前致谢。如果我没有遵循你的标准,我很抱歉..

1 个答案:

答案 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 ConcurrentQProcessQThread