linux - 在其他线程正在处理时保持主线程(Qt 应用程序)响应(POSIX)

标签 linux multithreading qt posix pppd

系统/软件详细信息: 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/

相关文章:

Python并行编程模型

c++ - 如何将 QMainWindow 鼠标点击位置传递给 QGraphicsView

linux - 添加额外的磁盘到根分区(centos6+Plesk)

windows - 从 linux 终端关闭 Windows 机器

c - linux 内核代码 ">>"运算符

java - 关键部分在 onSensorChanged() 中不起作用

linux - sshuttle 连接错误 : packet_write_wait: Connection to <server> port 22: Broken pipe (archlinux)

c++ - 不要真正理解 std::atomic::compare_exchange_weak 和 compare_exchange_strong 的逻辑

c++ - QList 的最大大小是多少?

qt - 插槽只用一个线程互相中断?