c语言中进行延时等待时如何执行其他程序

我现在想要实现如下功能:程序执行到某位置时等待30秒,如果用户没有按任意键就执行A程序,反之如果用户在这30秒内按了任意键,那么就执行B程序,也就是要在等待时持续检测按键按下的状态,这个功能该如何实现?

#include <stdio.h>
#include <conio.h>
#include <time.h>

int main() {
    int startTime = time(NULL);  // 记录开始等待的时间
    int waitingTime = 30;        // 等待时间为30秒
    int stopWaiting = 0;         // 是否停止等待的标志,0表示未停止,1表示已停止

    while (!stopWaiting && (time(NULL) - startTime) < waitingTime) {
        if (_kbhit()) {  // 判断是否有键按下
            stopWaiting = 1;
        }
    }

    if (!stopWaiting) {
        printf("30秒内未按下任何键,执行A程序");
        // TODO:执行A程序的代码
    } else {
        printf("检测到按键按下,执行B程序");
        // TODO:执行B程序的代码
    }

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7638791
  • 这篇博客你也可以参考下:假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。
  • 除此之外, 这篇博客: [作业]【C语言实现】假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表结点。中的 代码实例。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXINT 100
    
    typedef struct Node {
    	int data ;
        struct Node* next ;
    }Node;
    
    typedef struct Node* LinkList ;
    
    //打印一个单链表
    void ShowList(LinkList l) {
    	
    	LinkList p ;
    	p = (LinkList)malloc(sizeof(Node));
    	p = l->next ;
    	while(p != NULL){
    		printf("%d ", p->data) ;
    		p = p->next ;
    	}
    } 
    
    //创建一个单链表
    LinkList CreatLinkList(int n) {
    	
    	Node *h, *p, *q ; //设置三个结点,h保存la的头节点,q一直指向la的尾结点,p存储输入数据;
    	h = (LinkList)malloc(sizeof(Node));
        h->next = NULL ; //初始化链表 ,让它成为一个空表 
    	q = h ;  //开始时la的头结点与尾结点重合 
    	
    	int  i ;
    	
    	for (i = 0; i < n; i ++) {	
    		p = (LinkList)malloc(sizeof(Node)) ;
    		scanf("%d", &p->data) ;
    		p->next = q->next ;
    		q->next = p ; 
    		q = p ;
    	} 
    	
    	return h ;
    } 
    
    //倒置链表中的数据
    
    LinkList ReverseList(LinkList l) {
    	
    	Node *p, *q ; //设置两个结点 
    	p = l->next ; //p是l的第一个数据结点
    	l->next = NULL ; //将l移位指向链表末尾的结点,我们在l的后面重新将原本的数据插入,构成一个新的逆置链表
    	
    	while(p){
    		q = p->next ; //将p的下一位结点保存在q中
    		p->next = l->next ;
    		l->next = p ; //将p插入在L之后
    		p = q ;//完成p的后移 
    	} 
    	
    	return l ; 
    } 
    
    //按照递增顺序并置两个链表,最后转置数据 
    LinkList MergeList(LinkList la, LinkList lb) {
    	LinkList pa, pb;
        pa = la->next; //pa和pb分别指向la和lb的第一个数据结点 
        pb = lb->next;
        LinkList pc = la;//以La的头结点为并置的头结点 
        
        while(pa && pb){
            if(pa->data <= pb->data)//pa里数据比pb小,就连接pa指向的结点,pa指向la的后一个
            {
                LinkList qa = pa->next; //存储pa下一个结点的数据 
                pa->next = NULL; //将pa指针直接指向la的末尾,相当于将pa->data这个元素从队列中分离出来 
                pc->next = pa; //pc是一个准备摘取数据的指针,当pa小时,pc就指向pa,将已经摘取出的元素放在自己的链表里 
                pc = pc->next;
                pa = qa; //pa指针后移一个位置 
            }
            else{//pb里数据较小,就连接pb指向的结点,pb指向lb的后一个,同理 
                LinkList qb = pb->next;
                pb->next = NULL;
                pc->next = pb;
                pc = pc->next;
                pb = qb;
            }
        }
        pc->next = pa ? pa : pb;//合并剩下的没遍历完的部分
        return la;
    } 
    
    LinkList ProjectEntrance() {
    	
    	int n1, n2 ;
    	scanf("%d %d", &n1, &n2) ;
    	LinkList la ;
    	LinkList lb ;
    	la = CreatLinkList(n1) ; //创建链表并输入数据 
    	lb = CreatLinkList(n2) ;	
    	LinkList lc ;
    	lc =  MergeList(la, lb) ; //按照原有顺序并置两个列表 
    	return lc ;	
    	
    }
    
    int main() {
    	
    	LinkList l[MAXINT] ;
    	int i, j, n ;
    	scanf("%d", &n) ;
    	for( i = 0 ; i < n ; i ++ ){ 
    	l[i] = 	ProjectEntrance() ;
    	ReverseList(l[i]) ;  //逆置链表得到题目要求顺序 
    	} 		
    	for( i = 0;i < n ; i ++) {
    		ShowList(l[i]) ;
    		for(j = 0; j < n - 1 ; j ++ ){
    		printf("\n") ;
    		}
    	}
    
    	return 0 ;
    }
    
    
  • 您还可以看一下 任苹蜻老师的从零开发一个iOS企业级项目实战之我的云音乐视频 教程课程中的 修复播放视频时音乐还在播放小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题: 在c语言中如何实现在延迟等待时检测并执行其他程序?请提供代码示例,并且添加一定的prompt,以便chatgpt更好地理解我的问题。

    解答: 在C语言中可以使用标准库中的usleep()函数来实现延迟等待,结合getchar()函数来检测用户输入,在等待期间内判断是否有用户输入,若有则执行程序B,否则执行程序A。代码示例如下(添加了注释以便理解):

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h> // 包含usleep()函数
    
    int main()
    {
        char input;
        // 延迟等待
        printf("Waiting for 30 seconds...\n");
        for(int i = 30; i > 0; i--) {
            printf("%d ", i);
            fflush(stdout); // 刷新输出缓冲区,让倒计时数字能够连续输出
            usleep(1000000); // 延迟1秒
            if((input = getchar()) != EOF) { // 若用户有输入
                printf("\nInput detected, executing program B.\n");
                // 执行程序B
                // ...
                return 0;
            }
        }
        printf("\nTime's up, executing program A.\n");
        // 执行程序A
        // ...
        return 0;
    }
    

    其中,usleep(1000000)表示延迟1秒,fflush(stdout)表示刷新标准输出缓冲区,getchar()函数用于获取用户输入的字符。程序在延迟等待期间会不断检测用户是否有输入,若有则会执行程序B并结束;若没有则会在延迟结束后执行程序A并结束。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^