真无聊一人
2020-12-10 09:20
采纳率: 100%
浏览 39

MFC多线程,线程函数是全局的,在线程里调用函数时,函数里的if语句无法执行

有一个链表,链表里每个节点的数据是当作参数传入要调用的函数里。每次循环,函数执行时间超过三秒就返回,到下一个节点执行。三个函数都是使用if语句来判断时间。

线程通过循环来遍历链表,当链表里只有一个节点时,函数里的if判断就可以执行。

但是有两个以上的节点时,只有第一个节点的if语句可以被执行,后面的都被忽略了,但是时间还是对的。

若第一个节点被撤销,下一个节点的if语句就可以执行了。

这是为什么呢555救救孩子实在是不懂

//线程调用的函数1,函数1在类中
void MyDialog::process_a(int i, int a, int PID)
{
    //开始计时
	clock_t time_begin = clock();	
	
	for (i; i < 10; i++) {
        //时间
		clock_t time_end = clock();

        如果时间差>3000,保存数据后退出
		if (ROUND(time_end - time_begin)>3000) {
			return;	//程序结束
				}
			}
		}

		a += 10;
		Sleep(1000);
	}

	//程序已运行完毕,从链表中删除
	if (i == 10) {
		DeleteProcess(PID);
	}
}



//线程调用的函数2,同理于函数1
void MyDialog::process_a(int i, int b, int PID)
{
    //开始计时
	clock_t time_begin = clock();	
	
	for (i; i < 10; i++) {
        //时间
		clock_t time_end = clock();

        如果时间差>3000,保存数据后退出
		if (ROUND(time_end - time_begin)>3000) {
			return;	//程序结束
				}
			}
		}

		b += 22;
		Sleep(1000);
	}

	//程序已运行完毕,从链表中删除
	if (i == 10) {
		DeleteProcess(PID);
	}
}



//线程函数
DWORD WINAPI Dispatchy_RR(LPVOID *arg)
{
    //传入对话框类的指针
	MyDialog *dialog = (MyDialog*)arg;

	CPCB *pCurrent = NULL;
    
    //当前指针指向链表头节点
	pCurrent = dialog->phead;

    //当节点不为0时
	while (dialog->nPCB > 0) {
		WaitForSingleObject(semp, INFINITE);

    	int index = pCurrent->process_mark;
		int i = pCurrent->i;
		int a = pCurrent->a;
		int PID = pCurrent->PID;
		
        //选择函数执行
		switch (index) {
		case 1:
			dialog->process_a(i, a, PID);
			break;

		case 2:
			dialog->process_b(i, a, PID);
			break;
    	}

		ReleaseSemaphore(semp, 1, NULL);
        
        //下一个节点
		pCurrent = pCurrent->next;
	}
	return 0;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • yemat 2020-12-10 13:37
    已采纳

    那你断点一下获取的时间,看看

    点赞 评论
  • yemat 2020-12-10 13:21

    调试一下看看就很清晰了

    点赞 评论
  • 真无聊一人 2020-12-10 13:27

    已经调试了,就是不知道为什么链表有两个节点时,第二个if语句不会执行。但是只有一个节点时就能正常运行

    点赞 评论
  • yemat 2020-12-10 13:29

    你在链表赋值的地方打断点,你看看第二链表里面有值吗

    点赞 评论
  • 真无聊一人 2020-12-10 13:32

    有的,而且if的判断条件也是有对的,但是就是其他地方都执行了,就没有执行if语句,

    点赞 评论
  • 真无聊一人 2020-12-10 14:10

    我把if里面原来的循环体改成直接赋值后就可以运行了,谢谢!

    点赞 评论

相关推荐 更多相似问题