工控编程吧
标题:
235上位机VC MFC安全与强制退出线程
[打印本页]
作者:
qq263946146
时间:
2016-3-1 22:00
标题:
235上位机VC MFC安全与强制退出线程
(, 下载次数: 12)
上传
点击文件名下载附件
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;
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/39f0149328b50b44941cb0e63d598745/0/0/w_19rsxg4935.swf-albumId=5507046509-tvId=5507046509-isPurchase=0-cnId=12[/iqiyi]
[note]1[/note]
(, 下载次数: 0)
上传
点击文件名下载附件
[weixinlianxi]1[/weixinlianxi]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4