Vega Prime应用程序都是多线程程序,至少包含绘制线程、剪切线程等。因此,很有必要对线程进行一定的了解。
线程可以分为两种:用户界面线程和工作者线程。
1.用户界面线程
处理用户输入的线程称作用户界面线程。在多数情况下,一个应用程序只有一个用户界面线程。这个线程处理所有用户活动所产生的事件(如按键操作或鼠标单击),用户界面线程还处理窗口消息。封装了线程所有功能的MFC 类是CWinThread 类。同样,在MFC 类的层次结构中,CWinThread 类是CWinApp 类的基类,所以CWinApp 类从它的基类那里继承了所有线程处理功能。因此,用户界面线程的一个典型例子就是应用程序对象,它是CWinApp 类或其派生类的一个实例。所以,当执行一个MFC应用程序时,就会启动一个用户界面线程。
2.工作者线程
可以在应用程序中创建的另一种线程是工作者线程。工作者线程不处理用户输入,而是为应用程序执行后台处理工作。例如,当创建一个电子表格应用程序时,除用户界面线程外,还需要创建工作者线程来处理某些活动(如重算、绘制图表及打印任务等)。工作者线程没有消息处理程序,因此不能处理任何事件或窗口消息。一个应用程序可以有多个工作者线程来在后台处理工作。
要创建一个线程,需要调用CWinThread 类的AfxBengiThread 函数。AfxBengiThread 函数有两个重载版本:一个用于工作者线程,另一个用于用户界面线程。
用来创建工作者线程的AfxBeginThread 函数的语法如图4.1.2所示。
图4.1.2 创建线程
下面是AfxBeginThread 函数的参数说明:
● ThreadFunction:需要在线程中执行的函数名称。当运行这个线程时,它将这个函数的地址提供给处理器。这个参数不能是 NULL,因为一个线程至少需要执行一个函数。ThreadFunction 必须是一个全局函数或一个类的静态函数成员。
● Parameter:需要给在线程中执行的函数提供的参数。(www.daowen.com)
● ThreadPriority:指定想要为线程设置的优先级。表4.1.2所示为预定义的用来设置线程优先级的整数值。高优先级的线程先执行。
表4.1.2 线程相对优先级
● StackSize:指定分配给要创建的线程的堆栈内容的大小。当指定StackSize的值为0时,默认堆栈大小设置为与创建当前线程的线程堆栈大小相等。
● ControlFlags:指定一些附加状态,如线程创建时的状态。对于ControlFlags,可以指定为0 或CREATE_SUSPENDED 值。当指定它的值为0时,线程在创建后立即启动;当指定为 CREATE_SUSPENDED时,以挂起模式创建,这时要执行这个线程,需要调用CWinThread::ResumeThread 函数。
● Security:指定一个线程的安全属性,它指向一个SECURITY_ATTRIBUTESS_结构。这个结构包含用于一个对象的安全描述符。如果指定为NULL,创建的线程的安全属性被设置为默认的安全属性。
线程的优先级从0 到31,数值越大,优先级越高。线程的优先级类型分为两类:
● 实时(real-time):从16 到31,不会自动改变,如设备监控进程。
● 可变优先级(variable-priority):从1 到15(级别0 保留为系统使用),可由OS 自动改变。
线程都是相对于创建进程而言,分为32个级别,进程的优先级也分为32个级别。线程的优先级由母进程优先级和线程优先级共同决定。线程运行次序并不是按照创建他们时的顺序来运行的,CPU 处理线程的顺序是不确定的,如果需要确定,那么必须自己编成实现。使用SetThreadPriority()方法设置优先级,设置线程的优先级函数如下:
BOOL SetThreadPriority(HANDLE hThread,int nPriority);
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。