如何在打开另一个图像时关闭图像 - 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");
// ...
}
有帮助吗?
如果一切不完美,我深表歉意;) 我正在用 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
中显示 - 等2秒
- 关闭(那个实例)
feh
- 在
feh
中显示
nav.png
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");
// ...
}
有帮助吗?