windows线程与窗口之间的关系?

windows线程与窗口之间的关系?,第1张

1,一个进程至少拥掘伏有一个线程,称为主线程,如果一个线程创建了窗口,拥有GUI资源,那么也称该线程为 GUI线程 ,否则就为 工作线程 。窗口是由线程创建的,创建窗口的线程就拥有该窗口。这种线程拥有关系的概念对窗口有重要的意义:建立窗口的线程必须是为窗口处理所有消息的线程。为了使这个概念更加明确具体,可以想像一个线程建立了一个窗口,然后就结束了。

      在这种情况下,窗口不会收到一个WM_DESTROY或WM_NCDESTROY消息,因为线程已经结束,不可能被用来使窗口接收和处理这些消息。每个线程,如果它至少建立了一个窗口,都由系统对它分配一个消息队列。这个队列用于窗口消息的派送(dispatch)。为了使拆姿窗口接收这些消息,线程必须有它自己的消息循环,消息循环一般如下:

      应判御携用程序不断的从消息队列中获取消息,然后系统通过DispatchMessage函数分派消息到相应窗口的窗口过程,使得消息得到处理。当获取到WM_QUIT消息时,GetMessage返回0,循环结束。

如是窗口程序,让子线程向主线程创建的窗口发自定义消息,用SendMessage(子线程会待主线程处理完毕)或PostMessage(子线饥蔽程发送消息后就继续自己的事)。

如基肢闭果不是窗口程序,就必需让主线程轮询,搏裂可以用一个flag,子线程设置flag,主线程定期检查flag,如果被置位,则进行相应处理并将flag复位。flag用临界区保护,这种方法除了在两个线程同时入临界区时以外,主线程不会被阻塞。当然也可以用Event,子线程SetEvent,主线程定期WaitForSingleObject,把超时设为1。如果子线程需要等待主线程的处理,就再加一个Event,子线程设置flag/触发Event1之后等特第二个Event,主线程处理完毕后触发第二个Event。

虽然有主线程这一说法(调用main的线程),但对于WINDOWS来说,所有线程都是平等的,并没有主次之分,因此也不会提供获得主线程的函数弯搭早码或方法.但要找到调用main的线程倒是有些方法可行的,虽然不一定正确.

1,获取线程的创建时间,通常情况下主线程的创建时间是最早的

2,如果是GUI程序,可以通过GetWindowThreadProcessId获取窗口的线程,通常程序员都使用主线程创建窗口

3,其中有一种是线程堆栈查找main函数的地址,如果发现了那就是所谓的主线程.

其实这个问题跟窗口一样,对于程序员来说一个进埋睁拿程有主窗口,但对于WINDOWS来说只有父窗口和子窗口的概念(但据<WINDOWS核心编程>里的说法,WINDOWS连线程的父子关系也不保存),所以也没用获取主窗口的API


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12282793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存