GetTimeOfdayはC言語標準ライブラリ関数であり、通常、現在のシステム時間を取得するために使用され、精度はマイクロ秒に達します。その声明は次のとおりです。
<span><span><span class="hljs-type">int</span></span><span> </span><span><span class="hljs-title function_">gettimeofday</span></span><span><span class="hljs-params">(<span class="hljs-keyword">struct</span></span></span><span> timeval *tv, </span><span><span class="hljs-keyword">struct</span></span><span> timezone *tz);
</span></span>
テレビは、秒数とマイクロ秒を含む時間数の構造です。
TZはタイムゾーン情報であり、タイムゾーン情報が焦点の範囲内にないため、通常はnullに合格できます。
GetTimeOfDayの返品値は、秒およびマイクロ秒単位で現在の時間であり、タスクの実行時間を正確に計算するために使用できます。
睡眠機能
睡眠関数は、プログラムの実行を一時停止するために使用され、そのユニットは秒数で、通常はコードの待機時間を制御するために使用されます。その声明は次のとおりです。
<span><span><span class="hljs-type">unsigned</span></span><span> </span><span><span class="hljs-type">int</span></span><span> </span><span><span class="hljs-title function_">sleep</span></span><span><span class="hljs-params">(<span class="hljs-type">unsigned</span></span></span><span> </span><span><span class="hljs-type">int</span></span><span> seconds);
</span></span>
ただし、睡眠機能は第2レベルまでのみ正確である可能性があります。より高い精密時間制御が必要な場合は、 USLoop機能を使用できます。これにより、マイクロ秒レベルで時間を渡すことができます。
タスクの実行を固定時間間隔内でループする必要があるなど、プログラム内のタスクの実行時間を正確に制御する必要があると仮定しますが、タスクの実行時間が長すぎたり短すぎたりしたくないとします。 GetTimeOfDayを使用して現在の時間を取得し、睡眠機能を組み合わせて各実行の間隔を調整できます。
現在の時間を取得します
最初にGetTimeOfdayに電話して、現在のシステム時間を取得します。これにより、タスクが実行され始めた時期がわかります。
ターゲット時間を計算します
100ミリ秒ごとに実行するタスクが必要であるとします。開始時間を取得した後、次のタスク実行のターゲット時間を計算できます。ターゲット時間は、現在の時間とタスク実行間隔に等しくなります。
目標時間が到着するまで待ちます
目標時間を計算した後、現在の時間と目標時間の違いを計算し、睡眠またはUSLEEPを使用して正確に待つことができます。これにより、タスクが長すぎたり短すぎたりするのを防ぐことができます。
タスクの精度を制御します
タスクの実行時間をより正確に制御する場合は、タスクが実行された後に現在の時間を確認して、タスク間の間隔が要件を満たしていることを確認できます。
これは、 GetTimeとSleepを使用してタスクの実行時間を制御するサンプルコードです。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 各タスク実行の間隔時間を設定します(ユニット:2番およびマイクロ2番)</span></span><span>
</span><span><span class="hljs-variable">$interval_sec</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// 2番</span></span><span>
</span><span><span class="hljs-variable">$interval_usec</span></span><span> = </span><span><span class="hljs-number">100000</span></span><span>; </span><span><span class="hljs-comment">// 微2番,100毫2番</span></span><span>
</span><span><span class="hljs-comment">// 現在の時間を取得します</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getCurrentTime</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable">$time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gettimeofday</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$time</span></span><span>[</span><span><span class="hljs-string">'sec'</span></span><span>] * </span><span><span class="hljs-number">1000000</span></span><span> + </span><span><span class="hljs-variable">$time</span></span><span>[</span><span><span class="hljs-string">'usec'</span></span><span>]; </span><span><span class="hljs-comment">// 返回当前时间的微2番数</span></span><span>
}
</span><span><span class="hljs-comment">// タスク実行の目標時間を計算します</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getTargetTime</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$interval_sec</span></span></span><span>, </span><span><span class="hljs-variable">$interval_usec</span></span><span>) {
</span><span><span class="hljs-variable">$current_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$current_time</span></span><span> + </span><span><span class="hljs-variable">$interval_sec</span></span><span> * </span><span><span class="hljs-number">1000000</span></span><span> + </span><span><span class="hljs-variable">$interval_usec</span></span><span>;
}
</span><span><span class="hljs-comment">// 時限タスクをシミュレートします</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">performTask</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// タスクの実行をシミュレートします(例えば:データの処理、聞くAPI待って)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Task performed at: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// メインプログラム</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-comment">// 現在の時間を取得します</span></span><span>
</span><span><span class="hljs-variable">$current_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-comment">// ターゲット時間を計算します</span></span><span>
</span><span><span class="hljs-variable">$target_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getTargetTime</span></span><span>(</span><span><span class="hljs-variable">$interval_sec</span></span><span>, </span><span><span class="hljs-variable">$interval_usec</span></span><span>);
</span><span><span class="hljs-comment">// タスクを実行します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">performTask</span></span><span>();
</span><span><span class="hljs-comment">// 计算待って待时间</span></span><span>
</span><span><span class="hljs-variable">$sleep_time</span></span><span> = </span><span><span class="hljs-variable">$target_time</span></span><span> - </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-comment">// タスクの実行時間が短い場合,渡すことができます usleep 来精确待って待</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$sleep_time</span></span><span> > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">usleep</span></span><span>(</span><span><span class="hljs-variable">$sleep_time</span></span><span>); </span><span><span class="hljs-comment">// 待って待直到目标时间到达</span></span><span>
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
この例では、タスクは100ミリ秒ごとに実行されます。 GetTimeOfday関数を通じて現在の時間を取得し、ターゲット時間を計算し、 USLoop関数を使用して正確に待機します。これにより、タスクの正確な制御が可能になり、システムのスケジューリングやその他の要因によって引き起こされる時間逸脱を回避できます。