gpt4 book ai didi

c++ - 从 Wt 小部件信号事件运行 popen() 的问题

转载 作者:行者123 更新时间:2023-11-30 05:28:40 25 4
gpt4 key购买 nike

我正在尝试将固件升级功能集成到 Witty 应用程序中。

应用程序通过/dev/ttyUSB0与外部设备通信,固件升级使用同一个端口,应用程序释放端口并调用外部命令行应用程序popen().

主要问题是它在 main 中执行时完美运行,但在从事件示例中执行时却不是:

m_pUploadButton->clicked().connect(std::bind([=] () {
pComputer->firmwareUpgrade();
}));

下面是相关函数的定义:

bool ComputerV2::upgradeFirmware()
{
m_oMutex.lock();

std::string sFile = "/home/alextown/MPLABXProjects/ordinateur_V2/dist/default/production/ordinateur_V2.production.hex";

std::string sResult = "";
std::string sCommand = "/home/alextown/QtProjects/build-pic32ubl-qt-qt5-Release/pic32ubl-qt --headless --port=/dev/" + m_sPort + " --file=" + sFile + " --erase --program --verify --jump-application";

std::cout << sCommand << std::endl;

int nResult = exec(sCommand,sResult);

std::cout << sResult << std::endl;

m_oMutex.unlock();

return nResult == 0;
}

int exec(std::string p_sCommand, std::string &p_sResult)
{
FILE *pipe = popen(p_sCommand.c_str(),"r");

p_sResult = "";

if(!pipe) return -1;

char buffer[128];

while(!feof(pipe))
{
if(fgets(buffer,128,pipe) != NULL)
{
p_sResult += buffer;
}
}

return pclose(pipe);
}

据我观察,从 main 运行升级时,一切正常(在升级模式下跳转设备,在正常模式下升级并跳回)。从widget运行时,通过端口/dev/ttyUSB0发送的数据不一样,从而导致通信问题和升级失败。

根据我的理解,Witty 小部件的线程运行与主应用程序的线程运行有些不同。

最佳答案

我强烈建议在外部线程或 std::launch::async'edstd::future` 中执行此更新,因为 Wt 线程确实特殊.

特殊方式,它们可能在某种线程池中运行,也可能在上下文中运行,即网络服务器的进程(虽然我猜你目前通过内置的 http-server 部署它,但想象一下你想要重用您的代码)。

那么你的 USB 驱动程序是否有特定的进程(全局、状态等)?那么最好的办法是在一个新创建的进程中进行升级,除了你的网络应用程序(有人称之为微服务)方法,使这种旧技术看起来更花哨)。

如果需要,Wt 提供了与外部事件同步的方法。参见 Wt::WApplication::bindWt::Server::post

分离这项工作还有一个好处,即您的 Web 应用程序在升级时仍会响应,这可能需要一些时间。此外,如果升级导致一些重大问题,您的 Web 应用程序可以更轻松地传递诊断消息或接管更好的问题操作。

关于c++ - 从 Wt 小部件信号事件运行 popen() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36703452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com