gcc (GCC) 4.6.3
c89
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用usleep.但是,我一直收到以下警告:
隐式声明函数usleep
我已经包含了unistd.h头文件.
手册页提到了这个问题.但我不确定我理解它:
usleep():
Since glibc 2.12:
_BSD_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
Before glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
Run Code Online (Sandbox Code Playgroud)
但不确定我对上述内容做了什么?
假设我有一个线程,应该定期执行一些任务,但这个时期是 每小时6次每小时12次(每5分钟),我经常看到用一个is_running标志控制线程循环的代码,每个循环检查一次,如下所示:
std::atomic<bool> is_running;
void start()
{
is_running.store(true);
std::thread { thread_function }.detach();
}
void stop()
{
is_running.store(false);
}
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
std::this_thread::sleep_for(5min);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果stop()函数被调用,比如说,start()在线程处于活动状态之后1毫秒,直到它唤醒299999毫秒,检查标志并死掉.
我的理解是否正确?如何避免保持活着(但是睡觉)应该已经结束的线程?到目前为止,我最好的方法如下:
void thread_function()
{
using namespace std::literals;
while (is_running.load())
{
// do some task...
for (unsigned int b = 0u, e = 1500u; is_running.load() && (b != e); ++b)
{
// 1500 * 200 = 300000ms = 5min …Run Code Online (Sandbox Code Playgroud) 我正在构建一个多线程应用程序,pthreads需要一个线程来定期检查一些东西.在此线程之间的时间内不应使用任何CPU.这有可能usleep()吗?是usleep()不是在忙着等待?或者有更好的解决方案吗?
在javascript中有这个甜蜜,甜蜜的功能window.setTimeout( func, 1000 ) ;,它将在1000毫秒后异步调用func.
我想在C++中做类似的事情(没有多线程),所以我把一个示例循环放在一起,如:
#include <stdio.h>
struct Callback
{
// The _time_ this function will be executed.
double execTime ;
// The function to execute after execTime has passed
void* func ;
} ;
// Sample function to execute
void go()
{
puts( "GO" ) ;
}
// Global program-wide sense of time
double time ;
int main()
{
// start the timer
time = 0 ;
// Make a … 我正在对 45 分钟 1.2GB 视频 80,0000 帧大小为 1344x756 的视频进行一些渲染,并且视频采用 mp4 格式,我正在尝试使用 x265 压缩输出视频问题是当我使用时cv2.VideoWriter 10 分钟的视频输出大小超过 2GB,这不是我想要的结果,所以我在 mac osx 和 ubuntu 18 上尝试了以下操作:
codec = cv2.VideoWriter_fourcc(*'HEVC')
out = cv2.VideoWriter('output.mp4', 'HEVC', fps, (width, height))
Run Code Online (Sandbox Code Playgroud)
我得到的只是运行时警告:
OpenCV: FFMPEG: tag 0x43564548/'HEVC' is not found (format 'mp4 / MP4 (MPEG-4 Part 14)')'
Run Code Online (Sandbox Code Playgroud)
我想要实现的不一定是最高质量的输出,而应该是高质量和尽可能小的尺寸。
最近我一直在用C++编写一个程序来ping三个不同的网站,然后根据通过或失败,它会在再次尝试之前等待5分钟或30秒.
目前我一直在使用ctime库和以下函数来处理我的等待.但是,根据我的CPU仪表,这是一个不可接受的解决方案.
void wait (int seconds)
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC;
while (clock () < endwait) {}
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案不可接受的原因是因为根据我的CPU仪表,程序在等待时运行在我CPU的48%到50%之间.我有一个Athlon 64 x2 1.2 GHz处理器.我的适度130线计划甚至不可能接近50%.
如何更好地编写我的等待函数,以便它只使用最少的资源?
我正在为我创建的计时器编写一个单元测试,并且遇到了我经常遇到的其他项目的问题.我想创建一个单元测试,启动我的计时器,等待片刻,然后在计时器运行后检查我的计时器的值.然后我可以测试我的计时器中的所有功能.
有没有办法做到这一点?我在文档中没有看到任何内容.如果这不是一个好习惯,请告知我应该做什么.
我一直想要一个暂停功能,我找到了这个.作为C的初学者,我不能肯定,但它看起来像是来自的功能<clock.h>.我想将它实现到我的代码中,但不是没有理解它.
void wait(int seconds){
clock_t start, end;
start = clock();
end = clock();
while (((end-start) / CLOCKS_PER_SEC) = !seconds)
end = clock();
}
Run Code Online (Sandbox Code Playgroud) 我写了一个程序,每隔五秒就会在十秒钟的时间内打印一个随机数(1-10).但它似乎每五秒打印一个以上的随机数.有人能指出我正确的方向吗?
clock_t start;
int random;
start = clock();
while (float(clock() - start) / CLOCKS_PER_SEC <= 10.0) {
if (fmod(float(clock() - start) / CLOCKS_PER_SEC, 5) == 0 && (float(clock() - start) / CLOCKS_PER_SEC) != 0) {
random = rand() % 10 + 1;
cout << random << endl;
}
}
return 0;
Run Code Online (Sandbox Code Playgroud) 为什么这不起作用.我只想加载效果.我刚刚编译了g ++编译器的代码.这需要时间,只需打印* * * B R E A K * * *.每个字母之间没有区别.
#include <iostream>
using namespace std;
int main()
{
int wait = 1000000000;
char text[] = {"* * * B R E A K * * *"};
for(int i = 0; i < 21; i++)
{
cout << text[i];
for(int j = 0; j < wait; j++)
;
}
}
Run Code Online (Sandbox Code Playgroud)