2015-12-07 72 views
0

考慮下面的程序:從嗶聲()中刪除睡眠,產生聲音的替代方法?

#include <stdlib.h> 
#include <stdio.h> 
#include <windows.h> 
int main(int argc, char** argv) { 
    for (int i = 0; i < 10; i++) { 
     Beep(220 * i, 250); 
     printf("%d\n", 22o * i); 
    } 
    return 0; 
} 

這使得聲音250毫秒,並打印聲音的頻率。打印之間有延遲,但是,由於它在嘟嘟聲之間休眠。

相反,如printf("\a");這樣的做法在蜂鳴聲之間沒有睡眠。我知道這並不完全等同於Beep(),因爲您無法調整聲音或更改持續時間,但我感興趣的是聲音之間的零度睡眠。

我想使用Beep(),其持續時間爲250ms,但我不希望程序在它們之間睡眠。我有一個粒子模擬器,在發生碰撞時產生一個聲音,但是當聲音播放時,模擬會持續一段時間。我想讓它發出250ms的嗶聲,但不涉及睡眠。

我有什麼選擇?

編輯; here's a video showing the pause in my simulator.

回答

2

而不是在主線程中播放聲音, 實例化一個用於播放嘟嘟聲的線程。

然後讓線程在發出嘟嘟聲時將其自行關閉。

Here是創建一個線程教程:

該代碼已採取從教程,然後體改您的需求:

#include <pthread.h> 
#include <stdio.h> 

/* This is our thread function. It is like main(), but for a thread*/ 
void *threadFunc(void *arg) 
{ 

    for (int i = 0; i < 10; i++) { 
     Beep(220 * i, 250); 
    } 

    return NULL; 
} 

int main(void) 
{ 
    pthread_t pth; // this is our thread identifier 
    int i = 0; 


    pthread_create(&pth,NULL,threadFunc,"foo"); 
    printf("%d\n", 22o * i); 

    while(i < 100) 
    { 
     usleep(1); 
     printf("simulation continues...\n"); 
     ++i; 
    } 

    printf("main waiting for thread to terminate...\n"); 
    pthread_join(pth,NULL); 

    return 0; 
}