AfxBeginThread需要需要CloseHandle???

caddor 2012-01-05 08:57:17
一般的创建线程,是会CloseHandle的

但是AfxBeginThread 需要吗???



问题2:

当线程暂停后,如果此时关闭 主界面。。。。

如何关闭子线程呢????


问题3:对于AfxBeginthread的线程, 主线程可不可以 用ExitInstance的方式来退出子线程???


...全文
317 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dahaiI0 2012-01-06
  • 打赏
  • 举报
回复
waitforsingle有个作用,第二个参数设置为无线大的时候,则可以 退出子线程。。。。。
----------------------
让线程退出和等待线程退出是2回事。
caddor 2012-01-06
  • 打赏
  • 举报
回复
线程在工作,用户要关闭程序,我肯定得设置 某个标志,

然后等待线程结束,,, 我要是直接ExitInstance子线程

比如:我的线程在往文件中写东西,此时退出,,很野蛮





[Quote=引用 12 楼 dahaii0 的回复:]

waitforsingle有个作用,第二个参数设置为无线大的时候,则可以 退出子线程。。。。。
----------------------
让线程退出和等待线程退出是2回事。
[/Quote]
caddor 2012-01-05
  • 打赏
  • 举报
回复
WaitForSinglgeObject的第一个参数是句柄,

线程也有句柄,自然可以传入进去


所以在主线程中用这个函数来等 子线程,,,是否结束




[Quote=引用 10 楼 gg606 的回复:]
引用 9 楼 caddor 的回复:
waitforsingle有个作用,第二个参数设置为无线大的时候,则可以 退出子线程。。。。。

当然,第一个参数为: 线程的句柄

吾未尝闻也!
[/Quote]
gg606 2012-01-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 caddor 的回复:]
waitforsingle有个作用,第二个参数设置为无线大的时候,则可以 退出子线程。。。。。

当然,第一个参数为: 线程的句柄
[/Quote]
吾未尝闻也!
caddor 2012-01-05
  • 打赏
  • 举报
回复
waitforsingle有个作用,第二个参数设置为无线大的时候,则可以 退出子线程。。。。。

当然,第一个参数为: 线程的句柄

caddor 2012-01-05
  • 打赏
  • 举报
回复
如你所说,不该ExitInstance。。。

关闭程序那个按钮的流程为:

设置一个退出标志, 恢复线程,然后 线程检测到标志后,则推出


关闭按钮的函数中:WaitForsingle即可


[Quote=引用 7 楼 gg606 的回复:]
1、不需要。这个是MFC封装了的。
2、当一个线程被挂起后,用户关闭程序,正确的做法当然是先退出挂起的线程,
方法先恢复线程,然后跟线程通信(可能是全局变量、事件,或者消息,前两个
一般用于跟工作线程通信,后者用于跟UI线程或者带有自写消息循环的线程通信},
让线程自己退出,主线程等待线程句柄(比如等1秒钟),如果等不到,可调用
TerminateThread 强行终止线程,当然,强……
[/Quote]
gg606 2012-01-05
  • 打赏
  • 举报
回复
1、不需要。这个是MFC封装了的。
2、当一个线程被挂起后,用户关闭程序,正确的做法当然是先退出挂起的线程,
方法先恢复线程,然后跟线程通信(可能是全局变量、事件,或者消息,前两个
一般用于跟工作线程通信,后者用于跟UI线程或者带有自写消息循环的线程通信},
让线程自己退出,主线程等待线程句柄(比如等1秒钟),如果等不到,可调用
TerminateThread 强行终止线程,当然,强行终止是可能造成内在泄漏的,
所以我一般宁可多等一会儿,比如两秒。
3、兔子党组织部长 给的代码,我觉得
pThread->m_bAutoDelete = FALSE; //是为了能够等到UI线程句柄,不然线程返回后句柄就无效了。好像对于工作线程没必要。
pThread->PostThreadMessage(...); //这里一般是传个WM_QUIT消息
WaitForSingleObject(pThread->m_hThread); //这就是等线程句柄,应该再加个时间,比如:
WaitForSingleObject(pThread->m_hThread, 2000);

CloseHandle(pThread->m_hThread); //这一句是否有必要?
delete pThread; //这是为了让线程类析构
pThread = NULL; //如果马上要退出程序了,这一句也可以不要。
caddor 2012-01-05
  • 打赏
  • 举报
回复
我的意思是说

当一个线程被挂起后,


用户关闭程序,那么 这个挂起的线程也必须退出,才是合乎常理的。。。。

所以,我在退出程序之前,也必须退出那个线程,而且是安全退出。。。。

退出有不少方式???

ExitInstance 安全否??

在主线程,中调用这个函数去退出 子线程




[Quote=引用 1 楼 visualeleven 的回复:]

AfxBeinThread();

CREATE_SUSPENDED Start the thread with a suspend count of one. Use CREATE_SUSPENDED if you want to initialize any member data of the CWinThread object, such as m_bAutoDelete or ……
[/Quote]
caddor 2012-01-05
  • 打赏
  • 举报
回复
你代码,有个疑问???


delete的的问题, 为什么要delete???



至于auto的属性,你是设置false

然后Close




[Quote=引用 4 楼 visualeleven 的回复:]

C/C++ code
CWinThread* pThread = AfxBeginThread(...,CREATE_SUSPENDED);
pThread->m_bAutoDelete = FALSE;
pThread->ResumeThread();

...
pThread->PostThreadMessage(...);
WaitForSingleObject(pThread->m_h……
[/Quote]
Eleven 2012-01-05
  • 打赏
  • 举报
回复
CWinThread* pThread = AfxBeginThread(...,CREATE_SUSPENDED);
pThread->m_bAutoDelete = FALSE;
pThread->ResumeThread();

...
pThread->PostThreadMessage(...);
WaitForSingleObject(pThread->m_hThread);
CloseHandle(pThread->m_hThread);
delete pThread;
pThread = NULL;
Eleven 2012-01-05
  • 打赏
  • 举报
回复
至于线程的关闭,你可以利用CWinThread::PostThreadMessage()给线程发送消息,在线程函数中处理。
用户 昵称 2012-01-05
  • 打赏
  • 举报
回复
不是有autodelete属性吗?
Eleven 2012-01-05
  • 打赏
  • 举报
回复
AfxBeinThread();

CREATE_SUSPENDED Start the thread with a suspend count of one. Use CREATE_SUSPENDED if you want to initialize any member data of the CWinThread object, such as m_bAutoDelete or any members of your derived class, before the thread starts running. Once your initialization is complete, use CWinThread::ResumeThread to start the thread running. The thread will not execute until CWinThread::ResumeThread is called.
仿多线程的效果一般有2种办法:第一种是通过定时器;第二种是启动多线程,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新线程的三种方法,有需要的朋友可以参考下。 第一种AfxBeginThread() 用AfxBeginThread()函数来创建一个新线程来执行任务,工作者线程的AfxBeginThread的原型如下: CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,   LPVOID lParam,   int nPriority = THREAD_PRIORITY_NORMAL,   UINT nStackSize = 0,   DWORD dwCreateFlags = 0,   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL   );//用于创建工作者线程 返回值: 成功时返回一个指向新线程的线程对象的指针,否则NULL。 pfnThreadProc : 线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL; pParam : 传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程. nPriority : 线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级. nStackSize : 指定新创建的线程的栈的大小.如果为 0,新创建的线程具有和主线程一样的大小的栈 dwCreateFlags : 指定创建线程以后,线程有怎么样的标志.可以指定两个值: CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:ResumeThread 0 : 创建线程后就开始运行. lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.如果为 NULL, 那么新创建的线程就具有和主线程一样的安全性. 如果要在线程内结束线程,可以在线程内调用 AfxEndThread. 一般直接用AfxBeginThread(ThreadProc,this); 示例: UINT myproc(LPVOID lParam){CITTDlg *pWnd = (CITTDlg *)lParam; //将窗口指针赋给无类型指针pWnd->KMeansSegment(); //要执行的函数return 1;}void CITTDlg::KMeansSegment(){// 主要处理函数在这里写}void CITTDlg::OnKMeansSegment() //按钮点击执行{AfxBeginThread(myproc, (LPVOID)this);//启动新的线程} 注意,工作者线程的函数必须是全局函数或静态成员函数,不能是普通的成员函数。 第二种CreateThread()函数原型为:HANDLECreateThread( NULL, // 没有安全描述符 0, // 默认线程栈的大小 MyThreadProc, // 线程函数指针,即函数名 (LPVOID)&n, // 传递参数 NULL, // 没有附加属性 NULL // 不需要获得线程号码 ); CreatThread,它返回的是一个句柄;如果不需要再监视线程,则用CloseHandle()关闭线程句柄。 线程的函数必须定义为: DWORD WINAPI MyThreadProc(LPVOID pParameter); 下面演示多线程操作控件,点击一个Button然后运行一个线程,将字符串显示在CEdit控件里面; 示例: .h头文件struct hS {CString Tmp;CTestDlg *hWnd; };//定义全局结构体,用来传递自定义消息DWORD WINAPI ThreadProc(LPVOIDlpParam);//线程函数声明,全局函数public: CString chtmp; struct hS *hTmp;protected: HANDLE m_hThread;//线程句柄 CEdit m_Edit;.cpp实现文件//线程执行函数DWORD WINAPI ThreadProc(LPVOID lpParam){//在这里写处理函数struct hS *Tmp2;Tmp2 = (hS*)lpParam;// 操作: Tmp2->hWnd->m_Edit.SetWindowText( (LPTSTR)Tmp2->Tmp );}void CTestDlg::OnBnClickedButton1(){ hTmp->Tmp = chtmp; hTmp->hWnd = this;//关键是把this指针传进去 m_hThread =CreateThread(NULL,0,ThreadProc,hTmp,0,NULL);//创建新线程 CloseHandle(m_hThread );} 用CreateThread()函数创建线程将返回一个线程句柄,通过该句柄你可以控制和操作该线程,当你不用时可以一创建该线程后就关闭该句柄,有专门的函CloseHandle()。关闭句柄不代表关闭线程,只是你不能在外部控制该线程(比如,提前结束,更改优先级等)。在线程结束后,系统将自动清理线程资源,但并不自动关闭该句柄,所以线程结束后要记得关闭该句柄。 第三种_beginthread() 函数原型为:intptr_t _beginthread( void( *start_address )( void * ), //指向新线程调用的函数的起始地址 unsigned stack_size, //堆栈大小,设置0为系统默认值 void *arglist //传递给线程函数的参数,没有则为NULL ); 返回值: 假如成功,函数将会返回一个新线程的句柄,用户可以像这样声明一个句柄变量存储返回值:   HANDLE hStdOut = _beginthread( CheckKey, 0, NULL )。如果失败_beginthread将返回-1。所在库文件: #include 线程函数的定义: 对于_beginthread()创建的线程,其线程函数定义为: void ThreadPro(void * pArguments ); _beginthreadex()为_beginthread()的升级版。 总结:AfxBeginThread是MFC的全局函数,是对CreateThread的封装。 CreateThread是Win32 API函数,AfxBeginThread最终要调到CreateThread。而_beginthread是C的运行库函数。
// Auto.cpp : implementation file // #include "stdafx.h" #include "xs.h" #include "Auto.h" #include "Parameter.h" #include "gep.h" #include "Public.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAuto dialog CAuto::CAuto(CWnd* pParent /*=NULL*/) : CDialog(CAuto::IDD, pParent) { //{{AFX_DATA_INIT(CAuto) m_Warn = _T(""); m_Sys_Time=_T(""); m_PosX = _T(""); m_PosY = _T(""); //}}AFX_DATA_INIT m_LedOn.LoadBitmap(IDB_LED_ON); m_LedOff.LoadBitmap(IDB_LED_OFF); } void CAuto::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAuto) DDX_Text(pDX, IDC_ARM, m_Warn); DDX_Text(pDX, IDC_SYS_TIME, m_Sys_Time); DDX_Control(pDX, IDC_LED_HOME0, m_Led_Home[0]); DDX_Control(pDX, IDC_LED_HOME1, m_Led_Home[1]); DDX_Control(pDX, IDC_LED_Z, m_Led_Home[2]); DDX_Control(pDX, IDC_LED_U, m_Led_Home[3]); DDX_Control(pDX, IDC_LED_OUT4, m_Led_Out[4]); DDX_Control(pDX, IDC_LED_OUT3, m_Led_Out[3]); DDX_Control(pDX, IDC_LED_OUT2, m_Led_Out[2]); DDX_Control(pDX, IDC_LED_OUT1, m_Led_Out[1]); DDX_Control(pDX, IDC_LED_OUT0, m_Led_Out[0]); DDX_Control(pDX, IDC_LED_LIMIT3, m_Led_Limit[3]); DDX_Control(pDX, IDC_LED_LIMIT2, m_Led_Limit[2]); DDX_Control(pDX, IDC_LED_LIMIT1, m_Led_Limit[1]); DDX_Control(pDX, IDC_LED_LIMIT0, m_Led_Limit[0]); DDX_Control(pDX, IDC_LED_IN13, m_Led_In[13]); DDX_Control(pDX, IDC_LED_IN12, m_Led_In[12]); DDX_Control(pDX, IDC_LED_IN11, m_Led_In[11]); DDX_Control(pDX, IDC_LED_IN10, m_Led_In[10]); DDX_Control(pDX, IDC_LED_IN9, m_Led_In[9]); DDX_Control(pDX, IDC_LED_IN8, m_Led_In[8]); DDX_Control(pDX, IDC_LED_IN7, m_Led_In[7]); DDX_Control(pDX, IDC_LED_IN6, m_Led_In[6]); DDX_Control(pDX, IDC_LED_IN5, m_Led_In[5]); DDX_Control(pDX, IDC_LED_IN4, m_Led_In[4]); DDX_Control(pDX, IDC_LED_IN3, m_Led_In[3]); DDX_Control(pDX, IDC_LED_IN2, m_Led_In[2]); DDX_Control(pDX, IDC_LED_IN1, m_Led_In[1]); DDX_Control(pDX, IDC_LED_IN0, m_Led_In[0]); /* DDX_Control(pDX, IDC_LED_HOME0, m_Led_Home0); DDX_Control(pDX, IDC_LED_HOME1, m_Led_Home1); DDX_Control(pDX, IDC_LED_Z, m_Led_Home2); DDX_Control(pDX, IDC_LED_U, m_Led_Home3); DDX_Control(pDX, IDC_LED_OUT4, m_Led_Out4); DDX_Control(pDX, IDC_LED_OUT3, m_Led_Out3); DDX_Control(pDX, IDC_LED_OUT2, m_Led_Out2); DDX_Control(pDX, IDC_LED_OUT1, m_Led_Out1); DDX_Control(pDX, IDC_LED_OUT0, m_Led_Out0); DDX_Control(pDX, IDC_LED_LIMIT3, m_Led_Limit3); DDX_Control(pDX, IDC_LED_LIMIT2, m_Led_Limit2); DDX_Control(pDX, IDC_LED_LIMIT1, m_Led_Limit1); DDX_Control(pDX, IDC_LED_LIMIT0, m_Led_Limit0); DDX_Control(pDX, IDC_LED_IN9, m_Led_In9); DDX_Control(pDX, IDC_LED_IN8, m_Led_In8); DDX_Control(pDX, IDC_LED_IN7, m_Led_In7); DDX_Control(pDX, IDC_LED_IN6, m_Led_In6); DDX_Control(pDX, IDC_LED_IN5, m_Led_In5); DDX_Control(pDX, IDC_LED_IN4, m_Led_In4); DDX_Control(pDX, IDC_LED_IN3, m_Led_In3); DDX_Control(pDX, IDC_LED_IN2, m_Led_In2); DDX_Control(pDX, IDC_LED_IN13, m_Led_In13); DDX_Control(pDX, IDC_LED_IN12, m_Led_In12); DDX_Control(pDX, IDC_LED_IN11, m_Led_In11); DDX_Control(pDX, IDC_LED_IN10, m_Led_In10); DDX_Control(pDX, IDC_LED_IN1, m_Led_In1); DDX_Control(pDX, IDC_LED_IN0, m_Led_In0); */ DDX_Text(pDX, IDC_STC_AXIS_X, m_PosX); DDX_Text(pDX, IDC_STC_AXIS_Y, m_PosY); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAuto, CDialog) //{{AFX_MSG_MAP(CAuto) ON_BN_CLICKED(IDC_RUN, OnAutoRun) ON_BN_CLICKED(IDC_STOP, OnAutoRun) ON_BN_CLICKED(IDC_P, OnAutoRun) ON_BN_CLICKED(IDC_RESET, OnAutoRun) ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAuto message handlers BOOL CAuto::OnInitDialog() { CDialog::OnInitDialog(); ZT=TRUE; bReset =FALSE; SetTimer(1,10,NULL); SetTimer(2,10,NULL); // void Init_MotionMsg(void); // bool MachineHomeFun(); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CAuto::OnAutoRun() { int nID = (UINT)LOWORD(GetCurrentMessage()->wParam); int i = 0; static bool ct1=0,ct2=0,ct3=0,ct4=0,ct5=0,ct6=0,ct7=0,ct8=0,ct9=0,ct10=0; short rtn=-1; short bit1; unsigned short exInpt=0xffff; MoveMode=1; switch(nID) { UpdateData(1); case IDC_RUN://运行 ///////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// if( !bReset) { MessageBox(AlmMessage[3],"警告");// SetDlgItemText(IDC_ARM,AlmMessage[3]); return ; } switch(g_MotionMsg.MoveState) { case 0: // ::GetLocalTime(&g_MotionMsg.RunTime);//初始化启动时间 g_MotionMsg.MoveState = 1;//运行状态 g_MotionMsg.MoveMode = 3;//自动模式 // SetDlgItemText(IDC_ARM,AlmMessage[0]); // for(;;) // { AutoMoveFun(); // SetTimer(1,10,NULL); // SetTimer(2,10,NULL); // if(g_MotionMsg.MoveState==2)break; // } // SetDlgItemText(IDC_ARM,AlmMessage[1]); g_HWorkThread = CreateThread(NULL,0,WorkLedThread,NULL,0,NULL); CloseHandle(WorkLedThread); // g_HRecvThread = CreateThread(NULL,0,RecvLedThread,NULL,0,NULL); // CloseHandle(WRecvLedThread); //AfxBeginThread(WorkLedThread,NULL,THREAD_PRIORITY_NORMAL); // hMutex=CreateMutex(NULL,FALSE,NULL); InitializeCriticalSection(&g_cs); // ReleaseMutex(hMutex); // AfxBeginThread(WorkLedThread,NULL); // Sleep(1); // DeleteCriticalSection(&g_cs); break; case 1: MessageBox(AlmMessage[0],"警告信息"); break; case 2: MessageBox("请检查复位开关","警告信息"); SetDlgItemText(IDC_ARM,"请先检查复位旋钮开关,按“停止”—>“复位”—>“启动”继续..."); break; } ////////////////////////////////////////////////////////// break; case IDC_STOP://停止 if( g_MotionMsg.MoveState == 0 ) { MessageBox(AlmMessage[1],"警告信息"); return; } SetDlgItemText(IDC_ARM,AlmMessage[1]); // TerminateThread(g_HSendThread,i); // TerminateThread(g_HWorkThread,i); // TerminateThread(g_HRecvThread,i);//终止三个辅助线程 g_MotionMsg.MoveState = 0; //停止状态 g_MotionMsg.MoveMode = 0; //自然模式 // g_MotionMsg.AddTime = CurTime; //附加上以前加工的时间 if( !bReset ) bReset = FALSE; //停止后要硬复位 break; case IDC_P://暂停 switch(g_MotionMsg.MoveState) { case 0: MessageBox(AlmMessage[1],"警告信息"); break; case 1: SetDlgItemText(IDC_ARM,AlmMessage[1]); // SuspendThread(g_HSendThread); // SuspendThread(g_HWorkThread); // SuspendThread(g_HRecvThread);//线程挂起 SetDlgItemText(IDC_P,"继 续"); // g_MotionMsg.AddTime = CurTime;//附加上以前加工的时间 g_MotionMsg.MoveState = 2;//暂停状态 break; case 2: SetDlgItemText(IDC_ARM,AlmMessage[0]); // ResumeThread(g_HSendThread); // ResumeThread(g_HWorkThread); // ResumeThread(g_HRecvThread);//线程减挂 SetDlgItemText(IDC_P,"暂 停"); // ::GetLocalTime(&g_MotionMsg.RunTime);//初始化启动时间 g_MotionMsg.MoveState = 1;//运行状态 break; } break; case IDC_RESET: //复位 //////////////////////////////////////////////////////////////////////////////////////// // MachineHomeFun(); ////////////////////////////////////////////////////////////////////////////////////////// if( g_MotionMsg.MoveState == 1 || g_MotionMsg.MoveState == 2 )//如果是运行状态 { MessageBox(AlmMessage[0],"警告信息"); MessageBox(AlmMessage[4],"警告信息"); return; } if(bReset){MessageBox(AlmMessage[11],"警告信息"); return; } /* short rtn=-1; unsigned long status; GT_GetSts(1,&status); if(status&0x2){GT_DrvRst(1); GT_RstSts(1,0xffd);} GT_GetSts(2,&status); if(status&0x2){ GT_DrvRst(2); GT_RstSts(2,0xffd);} */ //GT_RstSts(unsigned short axis,unsigned short mask); // GT_Reset(); // Reset();//进行硬件复位 SetDlgItemText(IDC_ARM,AlmMessage[6]); // g_HHomeThread = CreateThread(NULL,0,HomeThread,NULL,0,NULL); // CloseHandle(HomeThread); MachineHomeFun(); bReset=TRUE; SetDlgItemText(IDC_ARM,"复位完成,可按“启动铵钮”运行机器"); ////////////////////////////////////////////////////////////////////////////////////////////// break; } } void CAuto::OnTimer(UINT nIDEvent) {////////////////////////////////////////////////////////// /////////////运动状态与模式(时时) ////////////////////////////////////////////////////////// if(nIDEvent==1)//界面信息时钟 0 { SYSTEMTIME sysTm; ::GetLocalTime(&sysTm); m_Sys_Time.Format("%02d:%02d:%02d",sysTm.wHour,sysTm.wMinute,sysTm.wSecond); SetDlgItemText(IDC_SYS_TIME,m_Sys_Time);//显示系统时间 ////////////////////////////////////////////////// ////////////工作时间与加工数量(自动模式的运行状态) ////////////////////////////////////////////////// if( g_MotionMsg.MoveMode == 1 && g_MotionMsg.MoveState == 1 )//如果是运动状态并且自动模式 {//工作时间与加工数量计算 CString temp,temp1,temp2; temp1.Format("%08ld",g_MotionMsg.RunPcs); SetDlgItemText(IDC_WORKPCS,temp1);// 加工数量 ::GetLocalTime(&CurTime); //计算加工时间 if (CurTime.wMilliseconds >= g_MotionMsg.RunTime.wMilliseconds) CurTime.wMilliseconds = CurTime.wMilliseconds-g_MotionMsg.RunTime.wMilliseconds; else { CurTime.wSecond = CurTime.wSecond-1; CurTime.wMilliseconds = CurTime.wMilliseconds+1000-g_MotionMsg.RunTime.wMilliseconds; } ///////////////////////// if (CurTime.wSecond >= g_MotionMsg.RunTime.wSecond) CurTime.wSecond = CurTime.wSecond-g_MotionMsg.RunTime.wSecond; else { CurTime.wMinute=CurTime.wMinute-1; CurTime.wSecond=CurTime.wSecond+60-g_MotionMsg.RunTime.wSecond; } ////////////////////// if (CurTime.wMinute >= g_MotionMsg.RunTime.wMinute) CurTime.wMinute = CurTime.wMinute-g_MotionMsg.RunTime.wMinute; else { CurTime.wHour = CurTime.wHour-1; CurTime.wMinute = CurTime.wMinute+60-g_MotionMsg.RunTime.wMinute; } /////////////////////// CurTime.wHour = CurTime.wHour-g_MotionMsg.RunTime.wHour; ////////////////////////// if( (CurTime.wMilliseconds + g_MotionMsg.AddTime.wMilliseconds) >= 1000 ) { CurTime.wSecond++; CurTime.wMilliseconds = CurTime.wMilliseconds + g_MotionMsg.AddTime.wMilliseconds - 1000; } else CurTime.wMilliseconds += g_MotionMsg.AddTime.wMilliseconds; //////////////////////////////// if( (CurTime.wSecond + g_MotionMsg.AddTime.wSecond) >= 60 ) { CurTime.wMinute++; CurTime.wSecond = CurTime.wSecond + g_MotionMsg.AddTime.wSecond - 60; } else CurTime.wSecond += g_MotionMsg.AddTime.wSecond; /////////////////////////////// if( (CurTime.wMinute + g_MotionMsg.AddTime.wMinute) >= 60 ) { CurTime.wHour++; CurTime.wMinute = CurTime.wMinute + g_MotionMsg.AddTime.wMinute - 60; } else CurTime.wMinute += g_MotionMsg.AddTime.wMinute; //////////////////////////////////// CurTime.wHour += g_MotionMsg.AddTime.wHour; temp.Format("%02d:%02d:%02d:%02d",CurTime.wHour,CurTime.wMinute, CurTime.wSecond,CurTime.wMilliseconds); SetDlgItemText(IDC_STC_WORK_TIME,temp);//显示加工时间 temp2=atof(temp1)/atof(temp); SetDlgItemText(IDC_STC_WORK_VEL,temp2); //获取运动状态 CString tempStr; long Pos; //----------------运动数据的显示---------------------------------------// GT_GetAtlPos(1,&Pos); tempStr.Format(_T("%ld"),Pos/250); SetDlgItemText(IDC_STC_AXIS_X,tempStr); GT_Update(1); GT_GetAtlPos(2,&Pos); tempStr.Format(_T("%ld"),Pos/250); SetDlgItemText(IDC_STC_AXIS_Y,tempStr); GT_Update(2); } } else if(nIDEvent==2)//系统信息时钟 1 { unsigned short limit=65535,bit=1; GT_GetLmtSwt(&limit); if(!(limit&bit)) { m_Led_Limit[0].SetBitmap(m_LedOn); } else m_Led_Limit[0].SetBitmap(m_LedOff); bit<<=1; if(!(limit&bit)) { m_Led_Limit[1].SetBitmap(m_LedOn); } else m_Led_Limit[1].SetBitmap(m_LedOff); /////////////////////////////////// bit<<=1; if(!(limit&bit)) { m_Led_Limit[2].SetBitmap(m_LedOn); } else m_Led_Limit[2].SetBitmap(m_LedOff); bit<<=1; if(!(limit&bit)) { m_Led_Limit[3].SetBitmap(m_LedOn); } else m_Led_Limit[3].SetBitmap(m_LedOff); /////////////////////////////////// unsigned short exInpt=65535,bit1=1; GT_ExInpt(&exInpt); if(!(exInpt&bit1)) { m_Led_In[0].SetBitmap(m_LedOn); } else m_Led_In[0].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[1].SetBitmap(m_LedOn); } else m_Led_In[1].SetBitmap(m_LedOff); /////////////////////////////////// bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[2].SetBitmap(m_LedOn); } else m_Led_In[2].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[3].SetBitmap(m_LedOn); } else m_Led_In[3].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[4].SetBitmap(m_LedOn); } else m_Led_In[4].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[5].SetBitmap(m_LedOn); } else m_Led_In[5].SetBitmap(m_LedOff); /////////////////////////////////// bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[6].SetBitmap(m_LedOn); } else m_Led_In[6].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[7].SetBitmap(m_LedOn); } else m_Led_In[7].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[8].SetBitmap(m_LedOn); } else m_Led_In[8].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[9].SetBitmap(m_LedOn); } else m_Led_In[9].SetBitmap(m_LedOff); /////////////////////////////////// bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[10].SetBitmap(m_LedOn); } else m_Led_In[10].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[11].SetBitmap(m_LedOn); } else m_Led_In[11].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[12].SetBitmap(m_LedOn); } else m_Led_In[12].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[13].SetBitmap(m_LedOn); } else m_Led_In[13].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[14].SetBitmap(m_LedOn); } else m_Led_In[14].SetBitmap(m_LedOff); bit1<<=1; if(!(exInpt&bit1)) { m_Led_In[15].SetBitmap(m_LedOn); // SetDlgItemText(IDC_ARM,"检查复位旋钮开关,继续..."); } else { m_Led_In[15].SetBitmap(m_LedOff); } /////////////////////////////////// unsigned short Home=65535,bit2=1; GT_GetHomeSwt(&Home); if(!(Home&bit2)) { m_Led_Home[0].SetBitmap(m_LedOn); } else m_Led_Home[0].SetBitmap(m_LedOff); bit2<<=1; if(!(Home&bit2)) { m_Led_Home[1].SetBitmap(m_LedOn); } else m_Led_Home[1].SetBitmap(m_LedOff); /////////////////////////////////// bit2<<=1; if(!(Home&bit2)) { m_Led_Home[2].SetBitmap(m_LedOn); } else { m_Led_Home[2].SetBitmap(m_LedOff); GT_ClrSts(3); // GT_LmtsOff(3); //GT_GetAtlPos(3,&CurPos.z); GT_ZeroPos(3); AxisRunT(3,5000,10,0.1); } bit2<<=1; if(!(Home&bit2)) { GT_ClrSts(4); // GT_LmtsOff(4); //GT_GetAtlPos(4,&CurPos.u); GT_ZeroPos(4); AxisRunT(4,200,1,0.02); } else m_Led_Home[3].SetBitmap(m_LedOff); /////////////////////////////////// short rtn=-1; unsigned long status; GT_GetSts(1,&status); if(status&0x2){ SetDlgItemText(IDC_ARM,"X轴伺服报警,请排除,重新启动电源");} GT_GetSts(2,&status); if(status&0x2){ SetDlgItemText(IDC_ARM,"Y轴伺服报警,请排除,重新启动电源");} /* {short rtn; unsigned short bit1; rtn=GT_ExInpt(&exInpt);//读取IO if(rtn!=0)return; bit1=exInpt&0x0001; if(bit1==0) {m_Led_Limit[0].SetBitmap(m_LedOn);} else {m_Led_Limit[0].SetBitmap(m_LedOff);} } GT_GetAtlPos(1,&CurPos.x); m_PosX.Format("%08.3f",CurPos.x/SportPara.XYpos); SetDlgItemText(IDC_STC_AXIS_X,m_PosX); GT_Update(1); //得到x轴当前位置值 GT_GetAtlPos(2,&CurPos.y); m_PosY.Format("%08.3f",CurPos.y/SportPara.XYpos); SetDlgItemText(IDC_STC_AXIS_Y,m_PosY); GT_Update(1); // ShowPosShowIO(); */ } // TODO: Add your message handler code here and/or call default CDialog::OnTimer(nIDEvent); }

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧