2

我在使用封闭源代码的第三方库并暂停线程时遇到问题:使用此第三方库时我无法暂停线程。

操作系统是 Ubuntu 32 位。编译器是 g++。

下面的下一个代码很简单并且工作正常。

#include <chrono>
#include <thread>

int main()
{
    std::chrono::seconds duration(3);
    std::this_thread::sleep_for(duration);
}

我已经编译了它:

g++ -std=c++0x test1.cpp -o test1

好的,现在有这个第三方库(来自 AVT 的 GigE Vision Devices 的“PvApi”)和我的以下代码。

#include <chrono>
#include <thread>
#include <PvApi.h>

int main()
{
  PvInitialize();

  std::chrono::seconds duration(3);
  std::this_thread::sleep_for(duration);
}

我已经编译了它:

g++ -std=c++0x -D_x86 -D_LINUX -D_REENTRANT test2.cpp -lPvAPI -o test2

运行代码时,它真的运行了!它只是不会暂停一纳秒。为什么???

感谢您的任何提示!

4

2 回答 2

1

这可能为时已晚,但问题是这样的:PvInitialize() 显然在幕后运行 timer_create(),这会产生频繁的 SIGALRM 中断 sleep()(或 usleep(),两者都在调用 nanosleep ())。我知道的唯一解决方法是使用 nanosleep() (这是 AVT 的示例代码使用的)。如果您查看 nanosleep() 的手册页,它需要两个参数,都是指向 timespec 结构的指针。发生的情况是,当睡眠中断时,第二个 timespec 包含剩余的时间(即,假设还要睡眠多少时间)。以下代码段摘自 AVT 的示例代码:

/* 时间以毫秒为单位 */

void Sleep(unsigned int time) { struct timespec t,r;

    t.tv_sec    = time / 1000;
    t.tv_nsec   = (time % 1000) * 1000000;

    while(nanosleep(&t,&r)==-1)
            t = r;

}

您可以使用它来代替所有 sleeps(),它应该可以解决您的大部分问题,但要注意其他可能无法防止这种情况的库。您要处理的另一个地方是 select() 调用。

于 2013-04-11T02:16:50.497 回答
-1

PvInitialize 是否有可能处理操作系统发送的任何信号?这将停止您的进程的睡眠。

于 2012-12-13T17:33:17.293 回答