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.拖拽四个按钮<运行线程><安全退出线程><强制退出线程><获取线程退出状态>关联函数 - void CGkbc8Dlg::OnSafestop()
- {
- m_bLetThreadExit=TRUE;
- }
- void CGkbc8Dlg::OnForcestop()
- {
- TerminateThread(g_hThread,1);
- }
- void CGkbc8Dlg::OnButton4()
- {
- DWORD ExitCode,ErrorCode;
- if(GetExitCodeThread(g_hThread,&ExitCode))
- {
- if(ExitCode==1)
- MessageBox("线程已强制退出");
- else if(ExitCode==0)
- MessageBox("线程已正常退出");
- else if(STILL_ACTIVE==ExitCode)
- MessageBox("线程运行中");
- }
- else
- {
- ErrorCode = GetLastError();
- if(ERROR_INVALID_HANDLE==ErrorCode)
- MessageBox("线程未运行");
- }
- }
复制代码- void CGkbc8Dlg::OnStart()
- {
- m_bLetThreadExit = FALSE;
- DWORD wID;
- g_hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,(LPVOID)this,0,&wID);
- }
复制代码3.添加一变量(变量建议初始化为TRUE)及两自定义函数 - BOOL m_bLetThreadExit;//线程退出标识
- BOOL SaveDataToFile();//被线程调用,测试用
- BOOL IsWaitStopThread();//检查是否要等待退出线程
- BOOL CGkbc8Dlg::SaveDataToFile()
- {
- CHAR czPath[MAX_PATH];
- SHGetSpecialFolderPath(NULL,czPath,CSIDL_DESKTOP,FALSE);
- CString sFileName(czPath);
- sFileName+="\\工控编程吧";
- CStdioFile file(sFileName,CFile::modeReadWrite|CFile::modeCreate);
- int nData=0;
- CString sData;
- while(true)//执行10秒
- {
- if(IsWaitStopThread())//要求停止线程,退出
- break;
- sData.Format("%d\r\n",nData);
- file.SeekToEnd();
- file.WriteString(sData);
- Sleep(100);
- nData++;
- if(nData>=100)
- break;
- }
- file.Close();
- CString sNewFileName(sFileName);
- sNewFileName+=".txt";
- CopyFile(sFileName,sNewFileName,TRUE);
- DeleteFile(sFileName);
- return TRUE;
- }
复制代码- BOOL CGkbc8Dlg::IsWaitStopThread()[iqiyi]http://player.video.qiyi.com/39f0149328b50b44941cb0e63d598745/0/0/w_19rsxg4935.swf-albumId=5507046509-tvId=5507046509-isPurchase=0-cnId=12[/iqiyi]
- {
- return m_bLetThreadExit;
- }
复制代码4.在对话框源文件顶部添加线程函数等以下代码 - HANDLE g_hThread;
- DWORD WINAPI ThreadFunc(LPVOID lpParameter)
- {
- CGkbc8Dlg* pDlg=(CGkbc8Dlg*)lpParameter;
- pDlg->SaveDataToFile();
- return 0;
- }
复制代码我们来演示下功能实现的整个过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|