long get_thread_time(pthread_t id) { clockid_t id_zegara; errno = pthread_getcpuclockid(id, &id_zegara); test_errno("pthread_getcpuclockid"); return clock_ms(id_zegara); }
int main() { pthread_t id[N]; parametry param[N]; int i; srand(time(NULL)); printf("pocz±tek programu, uruchomianie zostanie %d w±tków\n", N); /* utworzenie w±tku */ for (i=0; i < N; i++) { param[i].id = i; param[i].n = rand() % 100000000 + 1; errno = pthread_create(&id[i], NULL, watek, ¶m[i]); test_errno("pthread_create"); } /* stan na mniej wiêcej pó³metku */ sleep(1); puts("po oko³o sekundzie w±tki zu¿y³y:"); for (i=0; i < N; i++) printf("* #%d: %ldms\n", i, get_thread_time(id[i])); /* oczekiwanie na zakoñczenie w±tków */ for (i=0; i < N; i++) { errno = pthread_join(id[i], NULL); test_errno("pthread_join"); } /* jeszcze podsumowanie */ puts(""); printf("g³ówny w±tek zu¿y³ %ldms czasu procesora\n", clock_ms(CLOCK_THREAD_CPUTIME_ID)); printf("proces zu¿y³ %ldms czasu procesora\n", clock_ms(CLOCK_PROCESS_CPUTIME_ID)); return EXIT_SUCCESS; }
// funkcja w±tku void* watek(void* _arg) { parametry* arg = (parametry*)_arg; int i; printf("w±tek #%d uruchomiony, dwa razy wykona %d pustych pêtli\n", (int)arg->id, (int)arg->n ); for (i=0; i < arg->n; i++) /* zu¿ycie czasu procesora */; sleep(2); for (i=0; i < arg->n; i++) /* zu¿ycie czasu procesora */; /* podsumowanie pracy */ printf("w±tek #%d zakoñczony, zu¿y³ %ldms czasu procesora\n", (int)arg->id, clock_ms(CLOCK_THREAD_CPUTIME_ID) ); return NULL; }
/* ‘ункциональный блок управлени¤ эжекторами */ void FB_EJECTOR(struct FB_EJECTOR* inst) { //////////////////////////////////////// // ¬ычислим врем¤ выполнени¤ полного цикла ѕЋ в сек. //////////////////////////////////////// (*inst).CYCLE_TIME = (clock_ms() - (*inst).time_last_cycle) / 1000.0; (*inst).time_last_cycle = clock_ms(); //////////////////////////////////////// // активность блока //////////////////////////////////////// // Ќ≈“ ј “»¬Ќќ—“», выходим из программы if ( (*inst).enable != 1 ) { //Samkaev (*inst).OUT_STATE = NONE;; // ¬ Ћ. if ( (*inst).IN_ON == 1 ) (*inst).OUT_STATE = ON; // ¬џ Ћ. if ( (*inst).IN_OFF == 1 ) (*inst).OUT_STATE = OFF; // ј¬ј–»я if ( (*inst).IN_FAULT == 1 ) { (*inst).OUT_STATE = FAULT; } // ј¬ј–»я (два состо¤ни¤) if ( (*inst).IN_ON == 1 && (*inst).IN_OFF == 1 ) { (*inst).OUT_STATE = FAULT; } //Samkaev //Samkaev // (*inst).IN_ON = 0; // (*inst).IN_OFF = 0; // (*inst).IN_FAULT = 0; //Samkaev (*inst).IN_MODE = 0; (*inst).IN_CMD = NONE; (*inst).OUT_ON = 0; (*inst).OUT_OFF = 0; (*inst).OUT_STATUS = 0; (*inst).OUT_CUR_PT_CMD = 0.0; (*inst).STATUS = 0; return ; } //////////////////////////////////////// // режим управлени¤ эжектором //////////////////////////////////////// // ј¬“ќћј“ if ( (*inst).IN_MODE == 0 ) { // если режим не дистанционный, то автоматический if ( (*inst).OUT_MODE != DIST ) (*inst).OUT_MODE = AUTO; } // –”„Ќќ… else (*inst).OUT_MODE = MAN; //////////////////////////////////////// // состо¤ние эжектора //////////////////////////////////////// // «јѕќћЌ»ћ ѕ–≈ƒџƒ”ў≈≈ —ќ—“ќяЌ»≈ (*inst).OUT_LAST_STATE = (*inst).OUT_STATE; // ¬ Ћ. if ( (*inst).IN_ON == 1 ) (*inst).OUT_STATE = ON; // ¬џ Ћ. if ( (*inst).IN_OFF == 1 ) (*inst).OUT_STATE = OFF; // ј¬ј–»я if ( (*inst).IN_FAULT == 1 ) { (*inst).OUT_STATE = FAULT; (*inst).STATUS = 2; } // ј¬ј–»я (два состо¤ни¤) if ( (*inst).IN_ON == 1 && (*inst).IN_OFF == 1 ) { (*inst).OUT_STATE = FAULT; (*inst).STATUS = 3; } // —ќ—“ќяЌ»≈ Ќ≈ »«¬≈—“Ќќ if ( (*inst).IN_ON == 0 && (*inst).IN_OFF == 0 && (*inst).IN_FAULT == 0 ) //&& (*inst).STATUS == 0 (*inst).OUT_STATE = NONE; //////////////////////////////////////// // управление эжектором //////////////////////////////////////// // ѕ–ќ¬≈– ј ќћјЌƒџ ќѕ≈–ј“ќ–ј if ( (*inst).IN_CMD_OPERATOR != NONE ) { (*inst).IN_CMD = (*inst).IN_CMD_OPERATOR; (*inst).IN_CMD_OPERATOR = NONE; } // ¬ Ћ. if ( (*inst).OUT_MODE != MAN && (*inst).IN_CMD == ON && (*inst).STATUS == 0 && (*inst).OUT_ON == 0 && ( (*inst).OUT_STATE == OFF || (*inst).OUT_STATE == NONE ) ) { (*inst).OUT_ON = 1; (*inst).OUT_OFF = 0; (*inst).OUT_CUR_PT_CMD = (*inst).CYCLE_TIME; } // ¬џ Ћ. if ( (*inst).OUT_MODE != MAN && (*inst).IN_CMD == OFF && (*inst).STATUS == 0 && (*inst).OUT_OFF == 0 && ( (*inst).OUT_STATE == ON || (*inst).OUT_STATE == NONE ) ) { (*inst).OUT_ON = 0; (*inst).OUT_OFF = 1; (*inst).OUT_CUR_PT_CMD = (*inst).CYCLE_TIME; } // ¬ Ћ. ƒ»—“јЌ÷»ќЌЌџ… –≈∆»ћ ”ѕ–ј¬Ћ≈Ќ»я if ( (*inst).IN_CMD == DIST_ON && (*inst).OUT_MODE != MAN ) (*inst).OUT_MODE = DIST; // ¬џ Ћ. ƒ»—“јЌ÷»ќЌЌџ… –≈∆»ћ ”ѕ–ј¬Ћ≈Ќ»я if ( (*inst).IN_CMD == DIST_OFF && (*inst).OUT_MODE != MAN ) (*inst).OUT_MODE = AUTO; // —Ѕ–ќ— ј¬ј–»» if ( (*inst).IN_CMD == RESET ) { (*inst).STATUS = 0; (*inst).OUT_LAST_CMD = (*inst).IN_CMD; (*inst).IN_CMD = NONE; } // «јѕќћЌ»ћ » —Ѕ–ќ—»ћ ќћјЌƒ” if ( (*inst).IN_CMD != NONE ) { (*inst).OUT_LAST_CMD = (*inst).IN_CMD; (*inst).IN_CMD = NONE; } // ќ“—„®“ ¬–≈ћ≈Ќ» Ќј ¬џѕќЋ≈Ќ≈Ќ»≈ ќћјЌƒџ if ( (*inst).OUT_CUR_PT_CMD != 0.0 ) { // врем¤ ещЄ не вышло if ( (*inst).OUT_CUR_PT_CMD <= (*inst).IN_PT_CMD ) (*inst).OUT_CUR_PT_CMD += (*inst).CYCLE_TIME; // врем¤ вышло else { // была команда на ¬ Ћ., но вентил¤тора не ¬ Ћ. if ( (*inst).OUT_LAST_CMD == ON ) { if ( (*inst).OUT_STATE != ON ) { (*inst).OUT_ON = 0; // сбросим управление (*inst).OUT_CUR_PT_CMD = 0.0; // обнулим врем¤ (*inst).STATUS = 4; // выставим статус ошибки } } // была команда на ¬џ Ћ., но носос не ¬џ Ћ. if ( (*inst).OUT_LAST_CMD == OFF ) { if ( (*inst).OUT_STATE != OFF ) { (*inst).OUT_OFF = 0; // сбросим управление (*inst).OUT_CUR_PT_CMD = 0.0; // обнулим врем¤ (*inst).STATUS = 5; // выставим статус ошибки } } // обнулим врем¤ (*inst).OUT_CUR_PT_CMD = 0.0; } } // if ( (*inst).OUT_CUR_PT_CMD != 0.0 ) // —Ѕ–ќ— ”ѕ–ј¬Ћ≈Ќ»я ѕ–» —ћ≈Ќ≈ —ќ—“ќяЌ»я if ( (*inst).OUT_STATE != (*inst).OUT_LAST_STATE ) { if ( (*inst).OUT_LAST_STATE == ON ) (*inst).OUT_ON = 0; if ( (*inst).OUT_LAST_STATE == OFF ) (*inst).OUT_OFF = 0; } //////////////////////////////////////// // защиты эжектора //////////////////////////////////////// //////////////////////////////////////// // блокировки эжектора //////////////////////////////////////// // обновим статус (*inst).OUT_STATUS = (*inst).STATUS; }