系统/软件详细信息: Qt版本4.7.4
Linux 内核:2.6.31(为 IMX25 构建的自定义内核)
外围设备: 图形液晶显示屏 (64x128) 移远通信(M 12) GPRS模块 热敏打印机
数据库:Sqlite3
我是一个初学者,在 Qt 或 Linux 编程方面没有太多经验。我开发了一个应用程序,用户手动输入一些数据并将数据保存在 sqlite 数据库中。所以我想做的是,在一段时间后,比如说 90 秒,数据库中的数据应该使用 GPRS 传输到服务器。
所以我使用Qt的信号和槽机制来进行定时数据传输。我创建了一个每 90 秒触发一次的槽,当槽被触发时,我正在创建/启动一个 POSIX 线程,该线程应该将数据传输到服务器。
该线程所做的就是启动“pppd”,一旦“pppd”启动,它就会查询数据库中的数据并将数据发送到服务器。一旦数据传输完成,我就会杀死“pppd”。该功能运行良好。
但问题是“pppd”需要时间才能启动,所以我不得不引入一些延迟。即 sleep 12 秒是为了让 pppd 成功启动。但由于 sleep 阻塞,它使主程序/线程无响应,直到启动“pppd”(即它停止/停止所有事件,如打印等)。当“pppd”启动时,主线程再次响应。
因此,请建议我一些解决方案,以便在“pppd”启动时保持主线程响应,或者请建议我是否有任何其他替代方案。如果我的方法有任何问题,也请指导我..
提前致谢。如果我没有遵循您的标准,我很抱歉..
最佳答案
有多种选择可供您选择。看起来你正在使用一个线程,但然后在主线程中调用 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 react 器能够自由地处理 GUI 事件而不是长查询。这是 Qt
中的一个经典问题,并且有很多文献。
或者,您可以使用 QProcess::concurrent()
调用,它允许您在另一个进程中运行函数,但我从未测试过它。
这里有一些引用资料供您查看:Qt Concurrent , QProcess ,和 QThread
关于linux - 在其他线程正在处理时保持主线程(Qt 应用程序)响应(POSIX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720344/