博文

Windows基本的数据类型(2006-09-24 20:49:00)

摘要:Windows基本的数据类型     下面列出较为常用的数据类型,大体包括了字符型、整型、浮点型、布尔型、
指针型以及Windows应用程程特有的句柄型,表示指针型的数据类型往往以P或LP
作为前缀,而句柄型总是冠以H。 类型                    定义
-------------------------------------------------------------
ATOM                    原子(字符串在原子表中的参考值)
BOOL                    布尔型(逻辑型)变量(应为TRUE或FALSE)
BOOLEAN                 布尔型(逻辑型)变量(应为TRUE或FALSE)
BYTE                    字节(8位)
CCHAR                   Windows字符
CHAR......

阅读全文(2343) | 评论:1

多线程:线程同步--使用临界区,使用信号量(2006-09-24 15:17:00)

摘要: 学习多线程之三:线程同步--使用互斥 下载本文配套代码

互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。通过CMutex来完成线程间的互质,即:CMutex Mutext;



从而我们可以这样来定义数据对象:#include "afxmt.h" class CDataArray{private:               int iArray[10];    CMutex Mutex;public:    CDataArray(){};    ~CDataArray(){};     void SetData(int iValue);    void GetDataArray(int aArray[10]);}; 成员函数实现如下:void CDataArray::SetData(int iValue){               CSingleLock SingleLock(&Mutex);               SingleLock.Lock();               for (int i=0;i<10;i++)          &......

阅读全文(342) | 评论:0

多线程:线程通信--利用事件对象 线程同步--使用临界区(2006-09-24 14:35:00)

摘要: 学习多线程之一:线程通信--利用事件对象
作者:龚辉斌 下载本文示例代码

在线程之间传送信号可以使用事件对象,用MFC的CEvent来表示。一个事件对象有两种状态:信号态与非信号态。线程能监视于信号态的事件,以便在适当的时间完成对事件的操作。



创建事件的语句如下: CEvent ThreadBegin; 事件被创建后就自动处于非信号态,要使用它处于信息态,必须使用对件对象的成员函数SetEvent(),即: ThreadBegin.SetEvent(); 线程监视这个信号来知道事件已准备就绪,从而可以进行其它的操作。而线程通过调用API函数WaitForSingleObject()来监视这个信号。 ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE); 该函数的两个参数分别表示要检查的事件句柄与函数等待事件时间。

INFINITE告诉WaitForSingleObject()在特定的事件不处于信号态时不要返回,即把它放在线程的开始的话,那么系统将挂起这个线程,直到事件处于信号态时才继续执行下去。当已经准备好线程继续执行下去的条件时,调用SetEvent(),当线程获得了相应信号态信号后便会继续执行下去。 一旦线程不再被挂起时,它便可以完成相关事务。但若要在主程序中通过线程结束,那么线程必须监视接下来的这个事件,看它是否处于信号态。线程可以通过对事件进行轮询,这时只要调用WaitForSingleObject()即可,只是等待时间参数的值被置为0,即: ::WaitForSingleObject(ThreadBegin.m_hObject,0); 当返回WAIT_OBJECT_0时,表示事件处于信号态,否则处于非信号态。 UINT ThreadProc(LPVOID param) {        ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);        ::MessageBox((HWND)param,"Thread Activ......

阅读全文(309) | 评论:0

用MFC编写多线程程序实例 (2006-09-24 13:56:00)

摘要:用MFC编写多线程程序实例 作者:林俊             线程技术使不同的代码可以同时运行。当然,只有在多C P U的计算机上,多个线程才能够真正地同时运行。然而,由于操作系统把C P U的时间分成很短的片段分配给每个线程,这样给人的感觉好像是多个线程真的同时运行。      线程的概念与1 6位环境中的多任务有很大的不同。或许曾听人们这样讲: Win32是一种抢占式操作系统,而Windows 3.1 是一种协作式的多任务环境。其关键区别在于:在抢占式多任务环境中,操作系统负责管理哪个线程在什么时候执行。如果当线程1暂停执行时,线程2才有机会获得CPU时间,我们说线程1是抢占的。如果某个线程的代码陷入死循环,这并不可怕,操作系统仍会安排时间给其他线程。在Windows 3.1下,程序员必须保证应用程序能够把控制权返还给Windows。如果这一步失败,将导致整个操作环境锁死,或许你已经有过这样的痛苦经历。只要稍微想想便会明白, 16位的Windows是如此脆弱,它依赖于应用程序的运行情况,并且不允许程序陷入死循环或无穷递归以及任何封闭状态。这是因为所有的应用程序都必须协助Windows工作,这种工作类型被称为协作式多任务系统。      在很多情况下,需要采用多线程技术进行程序设计。例如,常用的字处理软件Word,当输入文字的时候,Word同时进行拼写和语法的检验,也就是将文档中的词语与词库中的词语进行比较,并对文档中的语句进行语法分析。这些操作都比较耗费时间,但是我们在使用Word的时候并没有感觉到输入过程有明显的滞后现象。这里Word就采用了多线程技术,其中一个线程接收输入,另一个线程进行拼写和语法的检验。      而对于在VC下编写多线程的程序有多种方法可以直接使用WINDOWS提供的API函数编写,当然最为方便的还是使用MFC编写,今天我们在这里以几个具体的例子来说明一下如何用MFC来编写多线程程序。      一、用户界面线程示例:    ......

阅读全文(3163) | 评论:0

实现Windows 多线程的最简编码(2006-09-24 13:54:00)

摘要:实现Windows 多线程的最简编码 下载:源码 可执行文件     多线程是Windows 开发者不可回避的内容。但是对于初学者,上百行的实例代码是很不容易学习的,而且其中很多无关线程的编码也影响了我们的视线。这里我整理出来一个最简单的实现多线程的代码(这个程序将创建2个新的线程,每个线程都向控制台窗口输出一句话,如果在控制台输入数字“1”就开始线程,其它的输入就暂停线程。): 新建一个Console 工程; 修改stdafx.h 头文件,使之包含下面的内容:
#include <windows.h> //使用多线程必须的 #include <iostream> //这是观看效果用的
using namespace std; 然后是主文件的main 函数的改造: 首先在主文件main 函数的外部声明2个函数,给多线程调用。
DWORD WINAPI MTOne(LPVOID param);
DWORD WINAPI MTTwo(LPVOID param); 线程函数的实现如下:
DWORD WINAPI MTOne(LPVOID param){
  while(true)
  {
    Sleep(1000);
    cout<<"hi! ";
  }
  //一旦返回,这个线程就结束了。
  return 0;
} DWORD WINAPI MTTwo(LPVOID param){
  while(true)
  {
    Sleep(1000);
    cout<<"joy! ";
  }
  return 0;
} 然后在main 函数里......

阅读全文(3257) | 评论:0

用VC++实现多线程的调度和处理(2006-09-24 13:52:00)

摘要:用VC++5.0 实 现 多 线 程 的 调 度 和 处 理
张 万 春 一 多 任 务, 多 进 程 和 多 线 程 ---- Windows95 和WindowsNT 操 作 系 统 支 持 多 任 务 调 度 和 处 理, 基 于 该 功 能 所 提 供 的 多 任 务 空 间, 程 序 员 可 以 完 全 控 制 应 用 程 序 中 每 一 个 片 段 的 运 行, 从 而 编 写 高 效 率 的 应 用 程 序。 ---- 所 谓 多 任 务 通 常 包 括 这 样 两 大 类: 多 进 程 和 多 线 程。 进 程 是 指 在 系 统 中 正 在 运 行 的 一 个 应 用 程 序; 线 程 是 系 统 分 配 处 理 器 时 间 资 源 的 基 本 单 元, 或 者 说 进 程 之 内 独 立 执 行 的 一 个 单 元。 对 于 操 作 系 统 而 言, 其 调 度 单 元 是 线 程。 一 个 进 程 至 少 包 括 一 个 线 程, 通 常 将 该 线 程 称 为 主 线 程。 一 个 进 程 从 主 线 程 的 执 行 开 始 进 而 创 建 一 个 或 多 个 附 加 线 程, 就 是 所 谓 基 于 多 线 程 的 多 任 务。 ---- 开 发 多 线 程 应 用 程 序 可 以 利 用32 位Windows 环 境 提 供 的Win32 API 接 口 函 数, 也 可 以 利 用VC++ 中 提 供 的MFC 类 库 进 行 开 发。 多 线 程 编 程 在 这 两 种 方 式 下 原 理 是 一 样 的, 用 户 可 以 根 据 需 要 选 择 相 应 的 工 具。 本 文 重 点 讲 述 用VC++5.0 提 供 的MFC 类 库 实 现 多 线 程 调 度 与 处 理 的 方 法 以 及 由 线 程 多 任 务 所 引 发 的 同 步 多 任 务 特 征, 最 后 详 细 解 释 一 个 实 现 多 线 程 的 例 程。 二 基 于MFC 的 多 线 程 编 程 ---- 1 MFC 对 多 线 程 的 支 持 ---- MFC 类 库 提 供 了 多 线 程 编 程 支 持, 对 于 用 户 编 程 实 现 来 说 更 加 方 便。 非 常 重 要 的 一 点 就 是, 在 多 窗 口 线 ......

阅读全文(328) | 评论:0

多线程串口编程工具CserialPort类(2006-09-24 13:50:00)

摘要: 简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)    

    老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧。确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如。但我一直没有停止过用MSComm通讯控件,那么简单的东西,对付简单的任务完全可以,但当我们需要在程序中用多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通讯控件,如果这时你还不愿意自己编写底层,就用这个类:CserialPort类。

这是Remon Spekreijse写的一个串口类, 地址在:   http://codeguru.earthweb.com/network/serialport.shtml

类作者Remon Spekreijse已作了一个基于对话框的同时检测4个串口示例的程序,在上面的网址和我主页的串口源码下载页也可以找到。我在这儿主要介绍如何将这个类应用到VC中基于文档的程序中。为了加深对串口数据处理的了解,我们利用这个类解决如下问题:
问题:
串口2(COM2)每隔1秒向串口1(COM1)发送的NEMA格式的报文:串头为$,串尾为*,中间为一个xxxx的整数( 比如2345,不足4位则前面以0代替代),最后是hh校验,规定hh为xxxx四个数的半BYTE校验和,最后加上回车<CR>与换行<LF>。整个数据包为$xxxx*hh<CR><LF>。
串口1收到上述报文后,校验正确后,将发来的数据显示在视窗中,并记下发来的正确帧数和错误帧数,若正确,还向串口2发送Y,串口2收到Y后将收到的Y的计数显示在视窗中。
测试方法:
将三线制串口线联接上同一台计算机的两个串口,编好程序后就可测试。如果没有两个串口的微机,自己改改程序。

好了,你可以先下载源程序: scporttest.zip(大小:49KB,VC6,WIN9X/2000,SerialPort.h SerialPort.cpp是两个类文件)

阅读全文(339) | 评论:0

例程分析 多线程编程(2006-09-24 13:48:00)

摘要: 例程分析 多线程编程    ·bull77··yesky
  Windows系统平台经历了16位到32位的转变后,系统运行方式和任务管理方式有了很大的变化,在Windows 95和Windows NT中,每个Win32程序在独立的进程空间上运行,32位地址空间使我们从16位段式结构的64K段限制中摆脱出来,逻辑上达到了4G的线性地址空间,我们在设计程序时,不再需要考虑编译的段模式,同时还提高了大程序的运行效率。独立进程空间的另一个更大的优越性是大大提高了系统的稳定性,一个应用的异常错误不会影响其它的应用。与在MS-DOS和16位Windows操作系统中不同,32位Windows进程是没有活力的。这就是说,一个32位Windows进程并不执行什么指令,它只是占据着4GB的地址空间,此空间中有应用程序EXE文件的代码和数据。EXE需要的DLL也将它们的代码的数据装入到进程的地址空间。除了地址空间,进程还占有某些资源,比如文件、动态内存分配和线程。当进程终止时,在它生命期中创建的各种资源将被清除。

  如上所述,进程是没有活力的,它只是一个静态的概念。为了让进程完成一些工作,进程必须至少占有一线程,所以线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码。实际上,单个进程可能包含几个线程,它们可以同时执行进程的地址空间中的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和椎。每个进程至少有一个线址程在执行其地址空间中的代码,如果没有线程执行进程地空间中的代码,如果没有线程执行进程地址空间中的代码,进程也就没有继续存在的理由,系统将自动清除进程及其地址空间。为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮转方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。创建一个32位Windows进程时,它的第一个线程称为主线程,由系统自动生成,然后可由这个主线程生成额外的线程,这些线程又可生成更多的线程。

  例如,在基于Internet网上的可视电话系统中,同时要进行语音采集、语音编译码、图像采集、图像编译码、语音和图像码流的传输,所有这些工作,都要并行处理。特别是语音信号,如果进行图像编解码时间过长,语音信号得......

阅读全文(269) | 评论:0

多线程技术在VC++串口通信程序中的应用研究(2006-09-24 13:46:00)

摘要: 多线程技术在VC++串口通信程序中的应用研究   陆尔东 邓利平··yesky
  1 概述

  在现代的各种实时监控系统和通信系统中,在Windows 9X/NT下利用VC++对RS-232串口编程是常用的手段。Windows 9X/NT是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。进程是应用程序的运行实例,拥有自己的地址空间。每个进程拥有一个主线程, 同时还可以建立其他的线程。线程是操作系统分配CPU时间的基本实体,每个线程占用的CPU时间由系统分配,系统不停的在线程之间切换。进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的基本概念。

  2 VC++对多线程的支持

  使用MFC开发是较普遍的VC++编程方法。在VC++6.0下,MFC应用程序的线程由CWinThread对象表示。VC++把线程分为两种:用户界面线程和工作者线程。用户界面线程能够提供界面和用户交互,通常用于处理用户输入并相应各种事件和消息;而工作者线程主要用来处理程序的后台任务。

  程序一般不需要直接创建CWinThread对象,通过调用AfxBeginThread()函数就会自动创建一个CWinThread对象,从而开始一个进程。创建上述的两种线程都利用这个函数。

  线程的终止取决于下列事件之一:线程函数返回;线程调用ExitThread()退出;异常情况下用线程的句柄调用TerminateThread()退出;线程所属的进程被终止。 3 多线程在串口通信中的应用

  3.1 串口通信对线程同步的要求

  因为同一进程的所有线程共享进程的虚拟地址空间,而在Windows 9X/NT系统下线程是汇编级中断,所以有可能多个线程同时访问同一个对象。这些对象可能是全局变量,MFC的对象,MFC的API等。串口通信的几个特点决定了必须采用措施来同步线程的执行。

  串口通信中,对于每个串口对象,只有一个缓冲区,发送和接收都要用到,必须建立起同步机制,使得在一个时候只能进行一种操作,否则通信就会出......

阅读全文(353) | 评论:0

Windows多线程多任务设计初步(2006-09-24 13:44:00)

摘要: Windows多线程多任务设计初步  
  [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的应用软件无一不是多线程多任务处理,单线城的软件是不可想象的。因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的。本文针对多线程技术在应用中经常遇到的问题,如线程间的通信、同步等,对它们分别进行探讨。

  一、 理解线程

  要讲解线程,不得不说一下进程,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程的基本思想很简单,它是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应Visual C++中的CwinThread类的对象。单独一个执行程序运行时,缺省的运行包含的一个主线程,主线程以函数地址的形式,如main或WinMain函数,提供程序的启动点,当主线程终止时,进程也随之终止,但根据需要,应用程序又可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。

  一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。

  线程被分为两种:用户界面线程和工作线程(又称为后台线程)。用户界面线程通常用来处理用户的输入并响应各种事件和消息,其实,应用程序的主执行线程CWinAPP对象就是一个用户界面线程,当应用程序启动时自动创建和启动,同样它的终止也意味着该程序的结束,进城终止。工作者线程用来执行程序的后台处理任务,比如计算、调度、对串口的读写操作等,它和用户界面线程的区别是它不用从Cwi......

阅读全文(1862) | 评论:0