欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 为taskBus业余软件无线电平台完善自启动和自动运行功能

为taskBus业余软件无线电平台完善自启动和自动运行功能

2025/9/22 12:08:22 来源:https://blog.csdn.net/goldenhawking/article/details/140539198  浏览:    关键词:为taskBus业余软件无线电平台完善自启动和自动运行功能

这个taskBus 是一款我和朋友们一起开发的业余软件无线电平台,使用增强管道数据流转EPDR技术实现基于标准输入输出管道的交互。它的项目文件为json格式,扩展名为tbj。

因为很懒,一直以来,运行一个tbj文件,都需要打开、运行这些步骤。若要自动运行,需要依靠命令行模式的 taskbusConsole来执行。其实,想要GUI程序通过命令行打开文件,也是最基础的操作。但是这个功能竟然一直都没有实现。今天,就来实现一下。

题外话

相关代码发行版参考gitcode.net或者gitcode.com,如果它们还在的话。

我会保持git的链接可用。在非一线城市,github实在打不开,因此,我的所有代码都托管在国内的git。github上找到的,应该都是老的版本,有网络状况好的代码爱好者帮我搬上去的。在发行版说明里有到网盘的链接,里面有编译好的windows版本。

1. 命令行参数设计

既然要添加命令行支持,当然需要一步到位完善一些。我们希望支持如下命令行参数:

调用方式:
C:\>可执行文件.exe [参数] [文件1.tbj [文件2.tbj  ]...]
注意,中括号[]不是命令的一部分,而是说明里面的参数是可选的。尖括号<>是表示里面的参数是必选的。参数:
--run 或者 -r : 执行打开的文件
--title <标题> 或者 -t <标题> :设置窗口的标题为title
--hide :启动后隐藏窗口到任务栏图标
--help或者-h或者-? :显示帮助命令。

2. 命令行解析

如果是C语言则有专门的命令行解析工具getopt。此外,在Qt下,Qt的app也已经把命令行参数分离好了。我们直接用Qt分离好的参数,直接修改 main 函数,添加解析部分:

#include <QApplication>
//...
int main(int argc, char *argv[])
{QApplication app(argc, argv);//open CmdlineQStringList cmdlineList = app.arguments();int cntv = 0;bool autorun = false;bool autohide = false;bool pophelp = false;bool next_is_title = false;QString title = "";QStringList openFiles;foreach (QString argsre, cmdlineList){if (!cntv++)continue;if (argsre=="--run"||argsre=="-r")autorun = true;else if (argsre=="--hide")autohide = true;else if (argsre=="--title"||argsre=="-t")next_is_title = true;else if (argsre=="--help"||argsre=="-h"||argsre=="-?")pophelp = true;else if (next_is_title){title = argsre;next_is_title = false;}else{QFileInfo info_f(argsre);if (info_f.exists() && info_f.isFile()){openFiles << info_f.absoluteFilePath();}elsepophelp = true;}}if (pophelp){QString argv1 = argv[0];QMessageBox::information(&w,"Help","Usage: \n" +argv1 +"\n\t --run|-r : Run Opened projects(*.tbj);""\n\t --title|-t <title>  :Set program title;""\n\t --hide :Hide mainframe;""\n\t --help|-h|-? :Show this help message;");}foreach (QString fm, openFiles){w.openProject(fm,autorun);}if (title.length()>1 && title.length()<256)w.setWindowTitle(title);if (autohide)w.hideMainFrame();int ret = app.exec();LOG_PROFILE("Program",QString("Main End with return value %1.").arg(ret));return ret;
}

当然,这个处理方式和getopt相比,无法处理=分隔符,以及-t123这种没有空格分离的情况。

3. 使用显式事件循环

在主窗口执行打开动作的时候,因为原始设计中有些依赖定时器等工作的逻辑,需要显式进行消息循环,保证打开多个文件的时候,不会错乱。

void taskBusPlatformFrm::openProject(QString filename, bool autorun)
{slot_openprj(filename);for (int i=0;i<100;++i){QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);QThread::msleep(10);}if (autorun)on_action_Start_project_triggered();for (int i=0;i<100;++i){QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);QThread::msleep(10);}
}

4. 综合效果

综合效果:

  1. 可使用双击 tbj 文件的方式,选择“打开方式”为taskBusPlatform.exe打开文件。
  2. 可以使用命令行 “taskBusPlatform.exe -r 文件名 ”的方式运行文件。
  3. 可以指定 --hide 参数隐藏主界面
  4. 可以指定"–title 标题名"的方式改变主窗口的标题。这样,可以在运行多个主窗口的情况下,在任务栏区分各个窗口的功能。

如果选择“始终以这个程序打开tbj文件”,会发现图标也改变了。

图标如果创建 sendTo快捷方式,只要在cmd里敲

shell:sendto

而后新建快捷方式:
cmd
把 -r 添加进快捷方式,则可以直接打开并运行工程。

如果加入 --hide,则发现运行后,主界面不见了,回到了任务栏图标。

如果加入 --title,则发现标题也变了。

taskBusPlatform.exe --title 测试 --hide --run C:\projects\projects.tbj

ok

如此一来,taskBus就可以作为无人值守桌面一部分,放到“启动”里去了,直接打开程序,使得没有键鼠的树莓派看起来就像一个自动设备,加电即可运行。比如,参考这个文章的方法,设置一个MP3电台,给敬老院爷爷们的Old Radio放放老歌。

TaskBus Good

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词