如何在打开另一个图像时关闭图像 - linux c ++

How to close an image at the opening of another - linux c ++

如果一切不完美,我深表歉意;) 我正在用 C++ 编写一个程序,当它接收到传感器信息时,会全屏显示一张图片。 问题是当我想从一个图像转到另一个图像时,它会打开一个新的feh,直到计算机崩溃的那一刻因为它占用了所有内存...

如何让一张图片的打开关闭上一张?

这是我当前的命令行:

system("feh -F ressources/icon_communication.png&");

我必须指定我也触发一个声音,但是没有问题,因为程序在声音结束时自动关闭:

system("paplay /home/pi/demo_ecran_interactif/ressources/swip.wav&");

试过这个作为测试并且有效!谢谢@paul-sanders!

#include <iostream>
#include <chrono>
#include <thread>
#include <unistd.h>
#include <signal.h>

using namespace std;

pid_t display_image_file (const char *image_file)
{
    pid_t pid = fork ();
    if (pid == -1)
    {
        std::cout << "Could not fork, error: " << errno << "\n";
        return -1;
    }

    if (pid != 0)    // parent
        return pid;

    // child
    execlp ("feh", "-F", image_file, NULL); // only returns on failure
    std::cout << "Couldn't exec feh for image file " << image_file << ", error: " << errno << "\n";
    return -1;
}

int main()
{
    pid_t pid = display_image_file ("nav.png");
    if (pid != -1)
    {
        std::this_thread::sleep_for (std::chrono::milliseconds (2000));
        kill (pid, SIGKILL);
    }

    pid_t pid2 = display_image_file ("sms2.png");
}

Soooooooooo,这里的目标(就您的测试程序而言)似乎是:

  • feh
  • 中显示nav.png
  • 等2秒
  • 关闭(那个实例)feh
  • feh
  • 中显示sms2.png

如果你能让测试程序做到这一点,那么你就可以上路了(我不会为你的声音问题担心我漂亮的小脑袋(因为今天这里的温度超过 30 度),但是有一次你有你的测试程序 运行 然后你可能会自己弄清楚如何解决这个问题。

所以,我在您的代码中看到了两个问题:

  • 您没有努力关闭 'feh'
  • 的第一个实例
  • execlp() 并没有像您想象的那样做(具体来说,它永远不会 returns,除非由于某种原因失败)。

所以我认为你需要做的是这样的事情(代码未经测试,甚至可能无法编译,你需要找出正确的头文件以#include,但它至少应该让你继续):

pid_t display_image_file (const char *image_file)
{
    pid_t pid = fork ();
    if (pid == -1)
    {
        std::cout << "Could not fork, error: " << errno << "\n";
        return -1;
    }

    if (pid != 0)    // parent
        return pid;

    // child
    execlp ("feh", "-F", image_file, NULL); // only returns on failure
    std::cout << "Couldn't exec feh for image file " << image_file << ", error: " << errno << "\n";
    return -1;
}

int main()
{
    pid_t pid = display_image_file ("nav.png");
    if (pid != -1)
    {
        std::this_thread::sleep_for (std::chrono::milliseconds (2000));
        kill (pid, SIGKILL);
    }

    pid_t pid = display_image_file ("sms2.png");
    // ...
}

有帮助吗?