while(1) ループを実行するスレッドがあります。そのループの間、特定の時間に特定のタスクを実行する必要があるため、時間をチェックし続けます。ただし、時間を画面に出力すると、数秒に 1 回、ほぼ 700 ミリ秒の「穴」が開いていることがわかります。プロセスの優先度を設定してみました:
policy = SCHED_FIFO;
param.sched_priority = 18;
if( sched_setscheduler( id, policy, ¶m ) == -1 )
{
printf("Error setting scheduler/priority!\n");
}
スレッドの優先度と同様に:
pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
param.sched_priority = 50;
pthread_attr_setschedparam(&attr, ¶m);
m_INVThreadID = pthread_create( &m_BaseStationLocatorsThread, &attr,
ThreadBaseStationLocatorsHandler, (void*)
(this));//Linux
しかし、それは役に立ちませんでした。
時間を取得する方法は次のいずれかです。
struct timespec start;
clock_gettime( CLOCK_MONOTONIC_RAW, &start);
//gettimeofday(&tim, NULL);
//wInitTime = tim.tv_sec*1000 + tim.tv_usec/1000.0;
double x = start.tv_sec;
double y = start.tv_nsec;
x=x*1000;
y = y/1000000;
double result = x+ y;
return result;
または:
STime TimeHandler::GetTime()
{
STime tmpt;
time_t rawtime;
tm * timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
tmpt.day_of_month = timeinfo->tm_mday;
tmpt.month = timeinfo->tm_mon+1;
tmpt.year = timeinfo->tm_year+1900;
tmpt.Hours = timeinfo->tm_hour;
tmpt.Min = timeinfo->tm_min;
tmpt.Sec = timeinfo->tm_sec;
tmpt.MilliSeconds = GetCurrentTimeMilliSeconds();
return tmpt;
}
そして今、時間を印刷します:
STime timeinfo = GetTime();
string curTime;
int datePart;
string datePartSTR;
std::ostringstream convert;
datePart =timeinfo.day_of_month;
convert << datePart;
//curTime.append( convert.str());
convert << "/";
datePart = timeinfo.month;
convert << datePart;
//curTime.append( convert.str());
convert << "/";
datePart =timeinfo.year;
convert << datePart;
//curTime.append( convert.str());
convert << " ";
datePart =timeinfo.Hours;
if (timeinfo.Hours<10)
convert <<0;
convert << datePart;
//curTime.append( convert.str());
convert << ":";
datePart =timeinfo.Min;
if (timeinfo.Min<10)
convert <<0;
convert << datePart;
//curTime.append( convert.str());
convert << ":";
datePart =timeinfo.Sec;
if (timeinfo.Sec<10)
convert <<0;
convert << datePart;
convert << ":";
datePart =timeinfo.MilliSeconds;
if (timeinfo.MilliSeconds<100)
convert << 0;
if (timeinfo.MilliSeconds<10)
convert << 0;
convert << datePart;
curTime.append( convert.str());
return curTime;
何か案は?
ありがとう!