该Unix.sleep函数可以暂停程序整秒,但是如何暂停它不到一秒钟?
首先,我是android世界的初学者,如果这是一个愚蠢的问题,请向我道歉..
我正在尝试做以下事情:
并且这些步骤1到3将在For循环中执行用户给定的重试次数.
现在我的问题是:我陷入第2步.
我无法发挥waitfor(int seconds)作用.我尝试使用Runnable PostDelayed方法,但它没有给我所需的输出.
for(retry = UserChoice; retry > 0 && !isDataAvailable ; retry -- ){
enableInternet()
delay(10)
isDataAvailable = GetInternetAvailibility()
if(!isDataAvailable){
disableInternet()
}
}
Run Code Online (Sandbox Code Playgroud)
我试图将isDataAvailable = GetInternetAvailibility()语句置于postDelayed处理程序中,但它导致在延迟后执行enableInternet() disableInternet()时同时isDataAvailable = GetInternetAvailibility()执行.
我可以从日志中看到,enableInternet()执行UserChoice的次数没有任何延迟.
Thread.sleep(10000)只是冻结用户界面10秒......我该如何实现这一目标?
编辑:让我说清楚:
public void onClick(View v) {
// Perform action on click
for(i=0; i<3; i++ ){
System.out.println("Before..");
delay(5);
System.out.println("after..");
}
}
public void delay(int seconds){
milliseconds …Run Code Online (Sandbox Code Playgroud) 让我的程序进入睡眠时遇到一些问题我试图做的是当按下btnStart时firs随机设置图片到12 ImageButtons然后我希望它暂停5秒然后将第一个ImageButton更改为另一张图片
我的代码看起来像这样,现在当按下按钮时它会立即暂停...
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Collections.shuffle(pic);
int time=1;
press=true;
pic.get(0).setImageDrawable(getResources().getDrawable(R.drawable.memgreen));
pic.get(1).setImageDrawable(getResources().getDrawable(R.drawable.memgreen));
pic.get(2).setImageDrawable(getResources().getDrawable(R.drawable.memred));
pic.get(3).setImageDrawable(getResources().getDrawable(R.drawable.memred));
pic.get(4).setImageDrawable(getResources().getDrawable(R.drawable.memblue));
pic.get(5).setImageDrawable(getResources().getDrawable(R.drawable.memblue));
pic.get(6).setImageDrawable(getResources().getDrawable(R.drawable.memwhite));
pic.get(7).setImageDrawable(getResources().getDrawable(R.drawable.memwhite));
pic.get(8).setImageDrawable(getResources().getDrawable(R.drawable.mempurple));
pic.get(9).setImageDrawable(getResources().getDrawable(R.drawable.mempurple));
pic.get(10).setImageDrawable(getResources().getDrawable(R.drawable.memyellow));
pic.get(11).setImageDrawable(getResources().getDrawable(R.drawable.memyellow));
try {
Thread.sleep(5000);
pic.get(0).setImageDrawable(getResources().getDrawable(R.drawable.coin));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Run Code Online (Sandbox Code Playgroud) 我们正在使用Mac上的音频播放器项目,并注意到电源使用率非常高(约为google chrome执行相同工作负载的7倍).
我使用了xcode的能量分析工具,其中一个问题是我们有太多的CPU唤醒开销.
根据xcode:
每次CPU从空闲状态唤醒时,都会产生能量损失.如果唤醒很高,并且每次唤醒的CPU利用率很低,那么您应该考虑批处理工作.
我们已经将问题缩小到了一个usleep函数调用.
在我们的代码中,音频解码器是一个生产音频数据并将其插入消费者的生产者 - 音频播放器.我们的音频播放器基于OpenAL,它具有音频数据缓冲区.
因为音频播放器可能比生产者慢,所以我们总是在向音频播放器提供新的音频数据之前检查缓冲器的可用性.如果没有可用的缓冲区,我们会暂停一段时间再试一次.所以代码看起来像:
void playAudioBuffer(Data *data)
{
while(no buffer is available)
{
usleep()
}
process data.
}
Run Code Online (Sandbox Code Playgroud)
知道usleep是一个问题,我们做的第一件事就是删除usleep().(因为OpenAL似乎不提供回调或任何其他方式,轮询似乎是唯一的选择.)我们成功地将功耗降低了一半.
然后,昨天,我们尝试了
for(int i =0; i<attempts; ++i)
{
std::unique_lock<std::mutex> lk(m);
cv.wait_for(lk, 3, []{
available = checkBufferAvailable();
return available;
})
if (available)
{
process buf;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我们偶然尝试的一项实验.它对我们来说没有任何意义,因为逻辑上它执行相同的等待.并且条件变量的使用不正确,因为变量"available"只能由一个线程访问.但它实际上减少了90%的能耗,线程的CPU使用量下降了很多.现在我们比铬更好.但条件变量如何实现与以下代码不同?为什么它会节省我们的力量?
mutex lock;
while(condition is false)
{
mutex unlock;
usleep();
mutex lock;
}
...
mutex unlock
...
Run Code Online (Sandbox Code Playgroud)
(我们使用mac的活动监视器(能量编号)和cpu使用情况分析工具来测量能耗.)
我正在循环中运行一个进程,它对每天的操作数量有限制.当它达到这个限制时,我现在已经检查了循环中的时间,看它是否是一个新的日期.
最好的选择是:
我已经阅读了一些线程,说在循环中调用Thread.sleep()是有问题的,并且是一个严重的性能问题.但在某些情况下,这似乎是最自然的事情.
例如,如果我希望我的应用程序每3分钟执行一次(假设它是自动保存)
public void startAutosaveLoop(){
stop = false;
new Thread(new Runnable() {
@Override
public void run() {
while (!stop){
Thread.sleep(T*1000);
if (!stop){
// do something
}
}
}
}).start();
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?这种情况有问题吗?
如果我并排放两个电话来确定最小的可测量持续时间:
// g++ -std=c++11 -O3 -Wall test.cpp
#include <chrono>
typedef std::chrono::high_resolution_clock hrc;
hrc::time_point start = hrc::now();
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "duration: " << duration.count() << " ns" << std::endl;
Run Code Online (Sandbox Code Playgroud)
我已经在循环中运行了数千次,并且在我特定的3.40GHz桌面上我一直得到40 ns +/- 2 ns.
但是,当我想看看我能睡到的最短时间时:
#include <thread>
hrc::time_point start = hrc::now();
std::this_thread::sleep_for( std::chrono::nanoseconds(1) );
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "slept for: " << duration.count() << " ns" << std::endl;
Run Code Online (Sandbox Code Playgroud)
这告诉我,我平均睡眠55400纳秒,或55.4微秒.远远超过我的预期.
把上面的代码放到for()循环中,我试着睡不同的数量,这就是结果:
我有许多线程(100),每次执行几秒钟.当它们执行时,它们花费大量时间等待来自另一个系统(串行设备)的响应.我注意到一次执行100个线程可能是资源占用,所以我实际上限制了任何时候都可以启动的线程数.
虽然在线程中等待外部事件必须有好的和坏的方法,但我想到了这一点.这种方法是CPU密集型的吗?:
send command ;
repeat
until response arrived ;
process response ;
Run Code Online (Sandbox Code Playgroud)
这种方法是否会提高效率?:
send command ;
repeat
Sleep (20) ;
until response arrived ;
process response ;
Run Code Online (Sandbox Code Playgroud)
*附加信息*
环境是x86 Windows XP.线程代码是一个长期的和涉及一系列与串行设备,但在一般的相互作用,它由写入字符到COM端口(使用AsyncFree串行库)并等待字符由驻留在传入字符缓冲器被返回的和他们到达时处理它们.我想这个串行库会让设备读写.只要在线程的时间可以是一分钟,或短则几秒钟,但大部分时间都花在等待字符离开港口,或等待响应字符(波特率为慢),因此我的问题是关于线程在等待时表现的最佳方式.目前我Sleep在循环中调用等待CharactersInBuffer变为非零,在它到达时处理每个字符,并在我有完整响应时退出线程.所以代码看起来更像(忽略超时处理等):
send command ;
Packet = '' ;
repeat
repeat
Sleep (20) ;
until response character arrived ;
build Packet
until complete packet arrived
process response ;
Run Code Online (Sandbox Code Playgroud) 我已经读过,Thread.sleep()它将暂停当前运行的线程指定的时间,之后它将返回runnable状态,等待它运行.
此外,如果从synchronized上下文调用,sleep()则不会释放它所持有的锁.所以我想知道什么时候会释放锁.如果线程处于休眠状态,永远不会有机会运行,那么它将始终保持锁定,然后其他线程如何进入同步方法/块.
我不确定我是否提出有效的问题.但请帮帮我.