3

私は次のCコード(linux ubuntu)を使用して、ブローカーサーバーを5分ごとにサンプリングし、ビッドとアスクの値を取得しています。

int main(int argc, char *argv[])
{
struct stock myStock;
struct stock *myStock_ptr;
struct timeval t;
time_t timeNow;


strcpy(myStock.exchange,"MI");
strcpy(myStock.market,"EQCON");
strcpy(myStock.t3Id,"1");
strcpy(myStock.subscLabel,"");
strcpy(myStock.status,"0");
strcpy(myStock.ask,"");
strcpy(myStock.bid,"");

buildSubLabel(&myStock);

while (1) {
    t.tv_sec = 1;
    t.tv_usec = 0;

    select(0, NULL, NULL, NULL, &t);
    time(&timeNow);

    sample(&myStock);

    printf("DataLink on %s\n",myStock.subscLabel);
    printf("Time Now: --- %s",ctime(&timeNow));
    printf("DataLink Status---- %s\n",myStock.status);
    printf("Ask --- %s\n",myStock.ask);
    printf("Bid --- %s\n",myStock.bid);
    printf("###################\n");

}

return 0;
}

私ができないことは、特定の時間にサンプル関数をスケジュールすることです。9.01でサンプル関数を1回目9.052回目9.103回目9.15......9.20......など17.30まで呼び出したい17.30以降はプロセスが終了します。

よろしくマッシモ

4

2 に答える 2

2

特定の時間の後に必要な関数を呼び出すには、スレッドを使用する必要があります。
このようなことをします:

#include <pthread.h>
#include <unistd.h> // for sleep() and usleep()

void *thread(void *arg) { // arguments not used in this case
    sleep(9); // wait 9 seconds
    usleep(10000) // wait 10000 microseconds (1000000s are 1 second)
    // thread has sleeped for 9.01 seconds
    function(); // call your function
    // add more here
    return NULL;
}

int main() {
    pthread_t pt;
    pthread_create(&pt, NULL, thread, NULL);
    // thread is running and will call function() after 9.01 seconds
}

スレッド関数をコーディングする別の方法(プログラムの実行時間を確認することにより):

void *thread(void *arg) {
    while ((clock() / (double)CLOCKS_PER_SEC) < 9.01) // check the running time while it's less than 9.01 seconds
        ;
    function();
    // etc...
    return NULL;
}

注意:pthreadライブラリをリンクする必要があります!gccを使用している場合、これはになります-lpthread

pthread(POSIXスレッド)の詳細については、次のWebサイトを参照して
ください。https
://computing.llnl.gov/tutorials/pthreads/ および時計機能:
http ://www.cplusplus.com/reference/clibrary/ ctime / clock /

于 2012-07-25T15:41:55.873 に答える
0

処理を行った後 (つまり処理の後printf)、処理には時間がかかるため、遅延を計算する必要があります。17:30以降に到達したときにループを終了することもできます.

遅延を減らさないと、1 日を通して正しい時間にサンプルを取得できません。

于 2012-07-25T15:46:50.840 に答える