3.2 线程的通信
由于“暂停”、“停止”等消息是由主线程响应的,所以子线程要响应这些消息必须和主线程通信,由主线程通知子线程。由于采用的是辅助线程,因此不能使用windows消息通信。为此,我们可以使用全局变量,让主线程通知辅助线程。
为响应“暂停”、“停止”消息,分别申明一个布尔类型的全局变量:
BOOL g_zanting,g_tingzhi;
初始化时将全局变量赋值为假,即没有“暂停”和“停止”消息。在主线程的“暂停”和“停止”等消息响应函数中给全局变量赋值为真。加工过程控制线程调用动态链接库函数之前,需要循环查询是否可以发送下一个数据,同时可以在这个循环中查询哪个全局变量为真,执行相应的函数,从而实现主线程和辅助线程的通信。
3.3 线程的阻塞
当按下“暂停”按钮时,主线程的“暂停”消息响应函数将全局变量zanting赋值为真。加工过程控制线程查询到zanting为真,阻塞线程,并向运动控制卡发出停止命令,记录当前的运动状态。当用户按下继续加工按钮时,线程从当前状态下继续执行。为了实现线程的阻塞,需要调用WaitForSingleObject函数,它的用法如下。
参数hHandle是指向一个事件对象的句柄。事件
是Windows的一种内核对象,在进程内部。事件是用唯一的32位句柄来标识的。它的句柄可以进行复制,以便在进程之间进行共享。事件可以为有信号(或真)状态或无信号(或假)状态。事件有两种类型:手工复位和自动复位事件。这里使用了自动复位事件。MFC为事件对象提供了一个方便的CEvent类,它是从CSyncObject类中派生的。在默认状态下,构造函数在无信号状态生成自动重置事件对象。要实现暂停后继续加工功能,需要申明一个全局的事件对象CEvent g_evenOixu。当按钮按下时,在主线程的消息响应函数中调用CEvent::SetEvent设定事件为有信号状态。在加工过程控制线程中调用Wait—ForSingleObject(g-evenOixu,INFINITE)函数,当事件为有信号状态,此函数返回值为WAIT_OBJECT_0。
3.4 线程的终止
为了实现线程正常情况下,一次加工过程执行完成后,加工过程控制线程返回,线程正常终止。如果加工过程出现错误,或是用户停止加工,加工过程控制线程需要提前终止。提前终止线程需要从线程内调用AfxEndThread函数,将所需的退出代码作为唯一参数传递。这将停止执行线程,解除对线程堆栈的分配,分离附加到线程的所有DLL并从内存中删除线程对象。主线程和加工过程控制线程工作流程如图2。
4 结语
本系统在开发过程中将多线程技术应用在数控系统软件的开发中,把各个任务放在不同的线程中执行,解决了数控系统中多任务并发执行时产生的系统响应滞后的问题。通过改进,数控系统软件能较好地执行各种不同的任务,及时响应用户操作。