QQ登录

只需一步,快速开始

阻塞延时与非阻塞延时的实现--上位机VC

[ 复制链接 ]

阻塞延时与非阻塞延时的实现--上位机VC

阻塞延时与非阻塞延时的实现--上位机VC

阻塞延时与非阻塞延时的实现--上位机VC
功能展示
用过函数sleep()的都知道,使用此函数程序界面会出现不反的应假死现象,用户体验不够友好,当前例程实现sleep的扩展,延时界面仍旧可以操作,效果如图。点击<阻塞延时3S>程序调用sleep()函数,期间界面不可操作,点击<非阻塞延时3s>期间程序界面可任意操作
要点提示
非阻塞延时函数功能主要是通过线程实现,在线程中实现消息的再分配及开辟另一线程调用Sleep()函数,直到延时到位退出两线程;
实现功能
1.新建基于对话框的应用程序

2.拖拽一列表框控件,ID保持不变,添加按钮<阻塞延时3S><非阻塞延时3S>实现两种延时功能
  1. void CGkbc8Dlg::OnButton1() //阻塞延时
  2. {
  3.         time_t startTime = time(NULL);
  4.         Sleep(3000);        
  5.         time_t endTime = time(NULL);

  6.         CString sText;
  7.         sText.Format("block slept for %.0f ms",difftime(endTime, startTime));
  8.         CListBox *pList = (CListBox*)GetDlgItem(IDC_LIST1);
  9.         pList->InsertString(0,sText);
  10. }
  11. void CGkbc8Dlg::OnButton2() //非阻塞延时
  12. {
  13.         DWORD threadId;
  14.         CreateThread(NULL, 0, TestSleepTheadFunc, this, 0, &threadId);
  15.         /*
  16.         time_t startTime = time(NULL);
  17.         XSleep(3000);        // THIS IS THE MAIN FUNCTION CAL        
  18.         time_t endTime = time(NULL);
  19.         CString sText;
  20.         sText.Format("not block slept for %.0f ms",difftime(endTime, startTime));
  21.         CListBox *pList = (CListBox*)GetDlgItem(IDC_LIST1);
  22.         pList->InsertString(0,sText);
  23.         */
  24. }
复制代码
3.再实现线程函数TestSleepTheadFunc及Xsleep()函数
  1. DWORD WINAPI TestSleepTheadFunc(LPVOID param)
  2. {
  3.         time_t startTime = time(NULL);
  4.         XSleep(3000);        // THIS IS THE MAIN FUNCTION CAL        
  5.         time_t endTime = time(NULL);
  6.         CString sText;
  7.         sText.Format("not block slept for %.0f ms",difftime(endTime, startTime));
  8.         CGkbc8Dlg* pDlg = (CGkbc8Dlg*)param;
复制代码

  1. ListBox *pList = (CListBox*)pDlg->GetDlgItem(IDC_LIST1);
  2.         pList->InsertString(0,sText);

  3.         return 0;
  4. }
  5. struct XSleep_Structure
  6. {
  7.         int    duration;
  8.         HANDLE eventHandle;
  9. };
  10. DWORD WINAPI XSleepThread(LPVOID pWaitTime)
  11. {
  12.         XSleep_Structure *sleep = (XSleep_Structure *)pWaitTime;
  13.         Sleep(sleep->duration);
  14.         SetEvent(sleep->eventHandle);
  15.         return 0;
  16. }
  17. void XSleep(int nWaitInMSecs)
  18. {
  19.         XSleep_Structure sleep;        
  20.         sleep.duration                = nWaitInMSecs;
  21.         sleep.eventHandle        = CreateEvent(NULL, TRUE, FALSE, NULL);

  22.         DWORD threadId;
  23.         CreateThread(NULL, 0, &XSleepThread, &sleep, 0, &threadId);
  24.         MSG msg;
  25.         while(::WaitForSingleObject(sleep.eventHandle, 0) == WAIT_TIMEOUT)
  26.         {
  27.                 if(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))//get and dispatch messages
  28.                 {
  29.                         ::TranslateMessage(&msg);
  30.                         ::DispatchMessage(&msg);
  31.                 }
  32.         }
  33.         CloseHandle(sleep.eventHandle);
  34. }
复制代码
我们来演示下功能实现的整个过程

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:阻塞延时与非阻塞延时的实现--上位机VC.txt 
文件大小:48 Bytes  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索