线程(1)

原创 2013年12月02日 17:35:59

CreateThread()

      函数的lpThreadId带回来的是线程ID,线程ID是一个全局变量,可以独一无二地表示系统中任一进程中的某个线程。AttachThreadInput和PostThreadMessage就需要用到线程ID,这两个函数允许你影响到其他人(线程)的消息队列。

      CreateThread传回来的handle被称为一个核心对象(kernel object)。核心对象和所谓的GDI对象,如画笔、画刷或DC差不多,只不过它由KERNEL32.DLL管理,而非GDI32.DLL管理。【核心对象和用户对象】

核心对象清单:

      进程(process) ,  线程(thread) ,  文件(file)  ,事件(event) ,信号量(semaphore) , 互斥器(mutex), 管道(pipe,分为named和anonymous)。

      GDI对象和核心对象之间的区别:GDI对象有单一的拥有者,不是进程就是线程。核心对象可以有一个以上的拥有者,可以是跨进程的。使用一个引用计数保持对每一个拥有者的追踪,当引用计数降至0,这一核心对象即自动销毁。

线程其他函数:

        GetExitCodeThread()获取线程的退出代码。

        ExitThread():强制结束线程的运行。

         程序启动后就执行的那个线程被称为主线程,主线程有两个特点,第一,它必须负责GUI程序中的主消息循环;第二,这一线程的结束(不论是因为返回或因为调用了ExitThread会使得程序中的所有线程都被强制的结束,其他线程没有机会做清理工作。

        Win32说明文件一再强调线程分为GUI线程和Worker线程两种,GUI线程负责建造窗口以及处理主消息循环。Worker线程负责纯粹的运算工作。一般而言,GUI线程绝不会去做那些不能够马上完成的工作。

        GUI线程的定义是:拥有消息队列的线程。任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理,所有对此窗口的改变也都应该由该线程完成。

        如果worker线程也产生一个窗口,那么就会有一个消息队列随之被产生出来并附着到此线程身上,于是worker线程会摇身一变成为GUI线程。这里的意思是,Worker线程不能够产生窗口、对话框、消息框、或其他任务与UI有关的东西。

        如果一个worker线程需要输入或输出错误信息,它应该授权给UI线程来做,并将结果通知给worker线程。

         GetTickCount():返回的是系统从启动到现在进过的毫秒数。

等待线程结束:

         1,通过Sleep()函数,这个函数要求操作系统终止线程动作,直到渡过某个指定时间之后才恢复。

          2,使用busy loop,通过主线程不断调用GetExitCodeThread(),直到其结果不再是STILL_ACTIVE,但时间效率太低。

          3,waitforsingleObject():它能够在某个线程结束时(而不是某段时间结束时)被调用,由于让线程停工是操作系统的责任,很合理地我们会认为操作系统也有责任让其他线程知道某个线程停工了。该函数会让执行该函数的线程等待,知道等待的核心对象被标识为激发状态或者等待的时间结束。如果超时时间为0,使你能够检查handle的装备并立即返回,没有片刻停留,如果handle已经备妥,那么这个函数会成功并传回WAIT_OBJECT_0,否则,这个函数立即返回并传回WAIT_TIMEOUT。

          可被WaitForSingleObject()使用的核心对象有两种状态:激发与未激发,WaitForSingleObject会在目标物变成激发状态时返回。

         当线程正在执行,线程对象处于未激发状态,当线程结束时,线程对象被激发了。因此,任何线程如果等待的是一个线程对象,将会在等待对象结束时被调用,因为当时线程对象自动变成激发状态。

       Mutex:如果mutex没有被任何线程拥有,它就是出于激发状态,一旦一个等待的mutex的函数返回了,mutex就被自动重置为未激发状态。Semaphore和mutex类似,但它有个计数器,可以约束拥有者(线程)的个数。

MsgWaitForMultipleObjects

        该函数的特点是它不但可以等待内核对象,还可以等消息。也就是当有消息到来时,该函数也一样可以返回,并处理消息,这样就给了工作线程退出的机会。


  














相关文章推荐

\java线程.part1

  • 2008年07月23日 12:33
  • 4.77MB
  • 下载

C#学习笔记(1):中断被Socket.Accept阻塞的线程

刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦。监听代码是放在一个线程中,当在线程中调用Socket.Accept()函数时,倘若这时需要中止该线程,C#似乎没有提供现成的办法,使用了Th...
  • kingfox
  • kingfox
  • 2012年02月04日 15:07
  • 9733

Java学习06-线程1

1.进程概述 进程:是一个正在执行中的程序。            每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。 线程:就是进程中的一个独立的控制单元。   ...

线程间操作无效: 从不是创建控件“label1”的线程访问它。C#定时器

线程间操作无效: 从不是创建控件“label1”的线程访问它。 我在使用线程操作winfrom控件对象的时候报错,后来才发现问题所在:多线程中直接调用界面控件的方法是错误的做法,Invoke 和...
  • kllxyu
  • kllxyu
  • 2013年06月18日 17:35
  • 4962

Java两个线程轮换打印1-100内的奇数和偶数

问题:   两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。  public cla...

庖解Chrome源码(1)——线程模型 Smart Pointers

庖解Chrome源码(1)——线程模型   很多人喜欢Chrome,喜欢它的简洁,喜欢它的“快”。 简洁大家一目了然,无需多言,这里重点要说的是它的“快”。什么是“快”呢?大概不...

java线程1

Java线程:概念与原理   一、操作系统中线程和进程的概念 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。Windows系统中,一个运行...
  • soho95
  • soho95
  • 2011年09月07日 12:14
  • 228

EventBus的使用与原理 组件通信 线程通信(1)

开宗明义,这篇文章主要是介绍EventBus的使用与原理。循序渐进,第一篇讲使用,第二篇讲原理。简介 首先,要知道Eventbus是什么? 官网的定义是:EventBus is a publish/...

两个线程A和B, A打印1, 3, ..., 99, B打印2, 4, ..., 100, 要求A和B严格交替打印(Java实现)

第一种实现: public class ThreadAB1 { Thread A = new Thread(new Runnable() { public void run() { fo...
  • lmaz007
  • lmaz007
  • 2013年04月02日 23:38
  • 667

Java线程理解(1)

1.线程Thread单线程:在启动程序中只有一个main()程序进入点开始至结束。 多线程:有多个线程并行运行。 下面是龟兔赛跑的例子,龟和兔使用Runnable接口,分别重新定义自己的run方法。后...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程(1)
举报原因:
原因补充:

(最多只允许输入30个字)