0

系统/软件详情: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”启动时保持主线程响应,或者如果有任何其他替代方案,请建议我。如果我的方法有什么问题,也请指导我..

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

4

1 回答 1

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

于 2013-09-10T13:52:03.667 回答