一、函數(shù)功能說明
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)武陵,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
pthread_cond_timedwait 等待一個(gè)條件變量,或者超時(shí)就會(huì)返回
POSIX有兩種時(shí)鐘類型
1、CLOCK_REALTIME: 系統(tǒng)范圍內(nèi)的實(shí)時(shí)時(shí)鐘,是個(gè)時(shí)鐘,可以通過命令等方式修改該系統(tǒng)時(shí)間.
2、CLOCK_MONOTONIC:系統(tǒng)起機(jī)時(shí)到現(xiàn)在的時(shí)間,不能被設(shè)置和修改.
pthread_cond_timedwait()在沒有設(shè)置條件變量屬性的時(shí)候,默認(rèn)用的是CLOCK_REALTIME時(shí)間,
因此在極端情況下會(huì)出現(xiàn)實(shí)際等待的時(shí)間與設(shè)置的超時(shí)時(shí)間不同。
所以,對(duì)于linux的超時(shí)等待功能,最好是使用CLOCK_MONOTONIC進(jìn)行實(shí)現(xiàn),并且通過pthread_condattr_setclock實(shí)現(xiàn)。
而對(duì)于android系統(tǒng)而言,是不支持pthread_condattr_setclock,通過驗(yàn)證可以采用函數(shù)pthread_cond_timedwait_monotonic實(shí)現(xiàn)。
下面直接給出代碼的實(shí)現(xiàn)功能。
二、超時(shí)等待功能
[cpp] view plain copy
#include stdio.h
#include string.h
#include pthread.h
#include sys/time.h
#include sys/times.h
#include unistd.h
#include time.h
static pthread_mutex_t s_mut = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t s_cond = PTHREAD_COND_INITIALIZER;
void PthreadAttr_Init(void);
unsigned long long getSysTime(void);
void waitTimeout(void);
void PthreadAttr_Init(void)
{
#if defined(ANDROID)
#else
pthread_condattr_t cattr;
int iRet = -1;
iRet = pthread_condattr_init(cattr);
if (iRet != 0)
{
return;
}
pthread_mutex_init(s_mut, NULL);
pthread_condattr_setclock(cattr, CLOCK_MONOTONIC);
pthread_cond_init(s_cond, cattr);
pthread_condattr_destroy(cattr);
#endif
return;
}
void waitTimeout(void)
{
unsigned long long ullbefore = getSysTime();
unsigned long long ullafter = 0;
#if defined(ANDROID)
#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC) // 支持ANDROID下NDK的編譯,采用相對(duì)時(shí)間
struct timespec outtime;
memset(outtime, 0x00, sizeof(struct timespec ));
clock_gettime(CLOCK_MONOTONIC, outtime);
outtime.tv_sec += 2;
pthread_mutex_lock(s_mut);
pthread_cond_timedwait_monotonic(s_cond,s_mut, outtime);
pthread_mutex_unlock(s_mut);
ullafter = getSysTime();
printf("####01 interval[%lld] ms\n", ullafter - ullbefore);
#else //支持ANDROID下NDK的編譯,采用絕對(duì)時(shí)間
struct timeval now;
struct itmespec outtime;
gettimeofday(now, NULL);
outtime.tv_sec = now..tv_sec + 3;
outtime.tv_nsec = now.tv_usec * 1000;
pthread_mutex_lock(s_mut);
pthread_cond_timedwait(s_cond, s_mut, outtime);
pthread_mutex_unlock(s_mut);
ullafter = getSysTime();
printf("####02 interval[%lld] ms\n", ullafter - ullbefore);
#endif
#else // 支持LINUX下的編譯,采用絕對(duì)時(shí)間
struct timespec outtime;
memset(outtime, 0x00, sizeof(struct timespec ));
clock_gettime(CLOCK_MONOTONIC, outtime);
outtime.tv_sec += 4;
pthread_mutex_lock(s_mut);
pthread_cond_timedwait(s_cond, s_mut, outtime);
pthread_mutex_unlock(s_mut);
ullafter = getSysTime();
printf("####03 interval[%lld] ms\n", ullafter - ullbefore);
#endif
return;
}
unsigned long long getSysTime(void)
{
unsigned long long milliseconds = 0;
struct tms t_tmsTime;
clock_t t_CurTime;
static int s_clks_per_sec = 0;
if (s_clks_per_sec == 0)
{
s_clks_per_sec = sysconf(_SC_CLK_TCK);
}
if (s_clks_per_sec == 0)
{
return 0;
}
t_CurTime = times(t_tmsTime);
if (1000 % s_clks_per_sec == 0)
{
milliseconds = (1000 /s_clks_per_sec)*(unsigned long long )t_CurTime;//換算成毫秒
}
else
{
milliseconds = 1000 * (unsigned long long )t_CurTime/s_clks_per_sec;//換算成毫秒
}
return milliseconds;
}
int main(void)
{
PthreadAttr_Init();
waitTimeout();
return 0;
}
編譯命令:
gcc test_ptthrad_conf_timewait_monotonic.c -o test_ptthrad_conf_timewait_monotonic -lpthread -lrt
linux下的測(cè)試結(jié)果:
####03 interval[4010] ms
今天修改了android2.3的“屏幕超時(shí)”部分,主要是修改了超時(shí)時(shí)間,添加了“永不休眠”選項(xiàng)。這部分修改只是更改了對(duì)應(yīng)的XML文件,沒有涉及到代碼修改,大家都知道xml文件的作用,這里就不多說了。需要修改的文件如下:
android2.3\packages\apps\Settings\res\values\arrays.xml 中:
!-- Display settings. The delay in inactivity before the screen is turned off. These are shown ain a list dialog. --
string-array name="screen_timeout_entries"
item15 seconds/item
item30 seconds/item
item1 minute/item
item10 minutes/item
item30 minutes/item
itemnever sleep/item
/string-array
!-- Do not translate. --
string-array name="screen_timeout_values" translatable="false"
!-- Do not translate. --
item15000/item
!-- Do not translate. --
item30000/item
!-- Do not translate. --
item60000/item
!-- Do not translate. --
item600000/item
!-- Do not translate. --
item1800000/item
!-- Do not translate. --
item-1/item
/string-array
要是是系統(tǒng)屏幕永不超時(shí)也就是將待機(jī)時(shí)間設(shè)為“-1”,這是最關(guān)鍵的一點(diǎn);
對(duì)應(yīng)英文版本:
android2.3\packages\apps\Settings\res\values-cs\arrays.xml
string-array name="screen_timeout_entries"
item msgid="3342301044271143016""15 sekund"/item
item msgid="8881760709354815449""30 sekund"/item
item msgid="7589406073232279088""1 minuta"/item
item msgid="7001195990902244174""10 minuty"/item
item msgid="5721688686241190620""30 minut"/item
item msgid="7156442995039264948""never sleep."/item
/string-array
對(duì)應(yīng)中文版本:
android\android_gingerbread_skdv210\packages\apps\Settings\res\values-zh-rCN\arrays.xml
string-array name="screen_timeout_entries"
item msgid="3342301044271143016""15 秒"/item
item msgid="8881760709354815449""30 秒"/item
item msgid="7589406073232279088""1 分鐘"/item
item msgid="7001195990902244174""10 分鐘"/item
item msgid="5721688686241190620""30 分鐘"/item
item msgid="7156442995039264948""從不休眠"/item
/string-array
android獲取超時(shí)時(shí)長(zhǎng)的異常方式如下:設(shè)置超時(shí)機(jī)制
client.getParams().setIntParameter(
HttpConnectionParams.SO_TIMEOUT, TIME_OUT_DELAY); // 超時(shí)設(shè)置
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, TIME_OUT_DELAY);// 連接超時(shí)
這里設(shè)置了兩種超時(shí),第一種是請(qǐng)求超時(shí),第二種時(shí)連接超時(shí)。
當(dāng)向服務(wù)器發(fā)出請(qǐng)求后,請(qǐng)求和服務(wù)器建立socket連接,但是很長(zhǎng)時(shí)間內(nèi)都沒有建立socket連接,這就時(shí)第一種請(qǐng)求超時(shí),這種情況主要發(fā)生在請(qǐng)求了
一個(gè)不存在的服務(wù)器。超時(shí)之后,會(huì)拋出InterruptedIOException異常。
Timeout for blocking operations. The argument value is specified in
milliseconds. An InterruptedIOException is thrown if this timeout
expires.
當(dāng)前標(biāo)題:android超時(shí),手機(jī)一直請(qǐng)求超時(shí)
標(biāo)題URL:http://jinyejixie.com/article48/dsseeep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站排名、企業(yè)建站、關(guān)鍵詞優(yōu)化、響應(yīng)式網(wǎng)站、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)