QQ登录

只需一步,快速开始

235上位机VC MFC安全与强制退出线程

[ 复制链接 ]

235上位机VC MFC安全与强制退出线程

235上位机VC MFC安全与强制退出线程
235上位机VC MFC安全与强制退出线
功能展示
微软VC提供有线程退出函数TerminateThread() ExitThread(),但线程的退出应该在安全的前提下进行,如果我们上位机程序的线程在执行生产任务时强制退出,不是产生次品就是损坏设备硬件,我们当前例程实现线程根据自身运行情况安全退出,效果如图。运行线程后,线程会在桌面创建一文件且向文件写入数据,点击安全退出,线程会停止写入且将桌面文件添加TXT后缀,使用户能够打开;点击强制退出线程,线程被强制退出,桌面文件是无后缀且被占用无法删除的不识别文件
要点提示
线程的退出建议由线程内部的函数实现另外线程创建后,或运行中,或停止时,其状态可以用函数GetExitCodeThread();
函数原型为:
BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode );
参数说明:
hThread Long:想获取退出代码的一个线程的句柄
lpExitCode Long:用于装载线程退出代码的一个长整数变量。如线程尚未中断,则设为常数STILL_ACTIVE;
返回BOOL类型值,非零表示成功,零表示失败。错误代码可调用函数GetLastError()获取
实现功能
1.新建基于对话框的应用程序
2.拖拽四个按钮<运行线程><安全退出线程><强制退出线程><获取线程退出状态>关联函数
  1. void CGkbc8Dlg::OnSafestop()
  2. {
  3.         m_bLetThreadExit=TRUE;
  4. }
  5. void CGkbc8Dlg::OnForcestop()
  6. {
  7.         TerminateThread(g_hThread,1);
  8. }
  9. void CGkbc8Dlg::OnButton4()
  10. {
  11.         DWORD ExitCode,ErrorCode;
  12.         if(GetExitCodeThread(g_hThread,&ExitCode))
  13.         {
  14.                 if(ExitCode==1)
  15.                         MessageBox("线程已强制退出");
  16.                 else if(ExitCode==0)
  17.                         MessageBox("线程已正常退出");
  18.                 else if(STILL_ACTIVE==ExitCode)
  19.                         MessageBox("线程运行中");
  20.         }
  21.         else
  22.         {
  23.                 ErrorCode = GetLastError();
  24.                 if(ERROR_INVALID_HANDLE==ErrorCode)
  25.                         MessageBox("线程未运行");
  26.         }
  27. }
复制代码
  1. void CGkbc8Dlg::OnStart()
  2. {
  3.         m_bLetThreadExit = FALSE;
  4.         DWORD wID;
  5.         g_hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,(LPVOID)this,0,&wID);        
  6. }
复制代码
3.添加一变量(变量建议初始化为TRUE)及两自定义函数
  1. BOOL m_bLetThreadExit;//线程退出标识
  2.         BOOL SaveDataToFile();//被线程调用,测试用
  3.         BOOL IsWaitStopThread();//检查是否要等待退出线程
  4. BOOL CGkbc8Dlg::SaveDataToFile()
  5. {
  6.         CHAR czPath[MAX_PATH];
  7.         SHGetSpecialFolderPath(NULL,czPath,CSIDL_DESKTOP,FALSE);
  8.         CString sFileName(czPath);
  9.         sFileName+="\\工控编程吧";
  10.         CStdioFile file(sFileName,CFile::modeReadWrite|CFile::modeCreate);
  11.         int nData=0;
  12.         CString sData;
  13.         while(true)//执行10秒
  14.         {
  15.                 if(IsWaitStopThread())//要求停止线程,退出
  16.                         break;
  17.                 sData.Format("%d\r\n",nData);
  18.                 file.SeekToEnd();
  19.                 file.WriteString(sData);
  20.                 Sleep(100);
  21.                 nData++;
  22.                 if(nData>=100)
  23.                         break;
  24.         }
  25.         file.Close();
  26.         CString sNewFileName(sFileName);
  27.         sNewFileName+=".txt";
  28.         CopyFile(sFileName,sNewFileName,TRUE);
  29.         DeleteFile(sFileName);
  30.         return TRUE;
  31. }
复制代码
  1. BOOL CGkbc8Dlg::IsWaitStopThread()[iqiyi]http://player.video.qiyi.com/39f0149328b50b44941cb0e63d598745/0/0/w_19rsxg4935.swf-albumId=5507046509-tvId=5507046509-isPurchase=0-cnId=12[/iqiyi]
  2. {
  3.         return m_bLetThreadExit;
  4. }
复制代码
4.在对话框源文件顶部添加线程函数等以下代码
  1. HANDLE g_hThread;
  2. DWORD WINAPI ThreadFunc(LPVOID lpParameter)
  3. {
  4.         CGkbc8Dlg* pDlg=(CGkbc8Dlg*)lpParameter;
  5.         pDlg->SaveDataToFile();
  6.         return 0;
  7. }
复制代码
我们来演示下功能实现的整个过程
  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


请点击此处下载

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

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

文件名称:238.上位机VC MFC安全与强制退出线程.zip 
文件大小:135.02 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

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

  

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

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

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