进程和消息队列
来源:互联网 发布:linux shell 等待确认 编辑:程序博客网 时间:2024/06/10 17:37
进程和线程,线程和消息队列,他们之间确实是有包含的
根据我的理解,进程应该是比较大的概念, 一个进程开始时至少会有一个主线程 ( 即主执行实例 ) ,这是在
用 Ctrl + Shift + ESC 可以在 Win2000 里调出任务管理器。
而消息队列则是与线程 ( Thread ) 相关的,换句话说,一个线程只能有一个消息队列 ( queue ) 与之相对应。 这跟之前说的有点不同,一个进程里面可以有多个线程;但是一线程里面就不能超出一个消息队列 ( Win98 里面甚至可以没有消息队列 )。
消息队列是在什么时候生成的呢? 在 Win2000 里面,从一开始创建线程就已经有了。( 在 Win98 里,我估计是在创建过窗口之后,留给你去证实 )
说了半天,可能一些刚入门的朋友还不知道什么是消息队列呢? 其实,Windows
微软提倡
编出多线程的程序其实并不难,难点其实在于线程同步 ( 线程间协调工作 ),下面的源程序正是为了简单介绍多线程编程的。
( 阅读的时候不要忘了主线程的入口是 WinMain 函数 )
// File Name: WinMain.cpp
#define WIN32_LEAN_AND_MEAN // Say No to MFC !!
#include <windows.h>
char Temp[77] = "";
// 我自定义的新线程入口 MyThread 函数
DWORD WINAPI MyThread( LPVOID lpParameter )
{
long ThrVal = 1 ;
for (ThrVal = 1; ThrVal < 16; ThrVal++ )
{
wsprintf( Temp , "这是副线程第 %ld 次显示" , ThrVal );
MessageBox( NULL, Temp, "第二线程内容 __CopyRight - `海风 ", MB_OK | MB_TOPMOST );
}
return 1 ;
} // 副线程结束
// Name: WinMain() 主线程的入口
// ------ ---------- ----------- ---------
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
DWORD dwThreadId, dwMyThrdParam = 1; // 第一个参数是新线程的 ID 号,第二个参数略
HANDLE hThread; // 副线程的 handle
// 调用函数创建新的线程,新线程入口是 MyThread 函数
hThread = CreateThread( NULL, // 没有 (或默认) 的属性
0, // 使用默认堆栈大小
MyThread, // 我的线程入口函数
&dwMyThrdParam, // argument to thread function
0, // 使用默认 creation flags
&dwThreadId); // Win98 里不能省略
// 已经创建了新的副线程
MessageBox( NULL, "已经创建了新的副线程、/n"
" 按确定结束主线程!", "主线程信息显示 __CopyRight - `海风 ", MB_OK | MB_TOPMOST );
ExitProcess(0);
return NULL;
}
如果说消息队列只有一个(在一个线程内),那么消息队列可以容纳多少条消息呢?我编程序去验证了一下:
// File Name: WinMain.cpp
#define WIN32_LEAN_AND_MEAN // Say No to MFC !!
#include <windows.h>
char Temp[77]="Hello world";
// Name: WinMain()
// ------ ---------- ----------- ---------
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
MessageBox( NULL, "按确定开始测试", "Simple_Code __CopyRight - `海风 ", MB_OK | MB_TOPMOST );
// 以上的一句请使用 Win98 的朋友别删除,因为在调用过创建窗口之类的函数后,你的线程才具有消息队列!
DWORD CurThreadID = GetCurrentThreadId( ); // 取得当前线程的 ID (标识号)
long i = 1 ;
for ( i = 1; i < 900000; i++)
{
if (! PostThreadMessage( CurThreadID, WM_USER , 11, 22 ) ) break;
// 上面的一句是如果不能再添加消息就打断 for 循环
}
wsprintf (Temp, "具体的消息队列长度是 %ld ", i);
MessageBox( NULL, Temp, "Sample_Code __CopyRight - `海风 ", MB_OK | MB_TOPMOST );
ExitProcess(0);
return NULL;
}
显示的结果是: 10000 ,有那么大么?!我也有点不太相信。
如果 10000 都还不够用,那么会怎样? 哎,当然是丢失了!
为了证明 消息队列 是 线程 的附属品,我查看了 MSDN ,最后在 PostThreadMessage() 函数的第一个参数解释那里找到证据,原文如下:
" The function fails if the specified thread does not have a message queue. The system creates a thread's message queue when the thread makes its first call to one of the Win32 User or GDI functions. For more information, see the Remarks section. "
含义大概是,当一个线程里面第一次调用 Win32 User 类函数 (或 图形界面类 函数) 的时候,系统会为该线程创建一个消息队列,否则就没有 消息队列。
不过,这个说法我认为在 Win2000 里面是不适用的,其实在系统创建线程的同时就创建了一个相关消息队列 (默认操作)。
我尝试过没有调用任何其他函数的情况下也可以
这个由系统维护的消息队列也挺自动化的! 举个简单例子是系统会自动调整 WM_PAINT 消息的数量使之不会重复; 更复杂一点的例子是你向线程里的一个窗口发送消息,然后 Destroy 那个窗口,最后才检测消息队列。 系统会认为那个窗口已经不存在而将与那窗口相关的多余消息一并 删除掉了,所以你一定没法在消息队列里找到先前你发送的那条消息。
好了,说太多怕打乱你的思路了,详细资料请参看 MSDN . 请在 MSDN 的索引一栏输入 " message queues [Win32] "
下次有时间我会详细说明一下消息泵这玩艺!
- 进程和消息队列
- 进程和消息队列
- PHP中的子进程和消息队列
- vc/mfc 进程消息队列,线程消息队列,和系统消息队列,该如何处理
- 进程通信消息队列
- [进程通信] 消息队列
- 进程通信--消息队列
- 进程通信-----消息队列
- 进程通信--消息队列
- 进程管理--消息队列
- 进程IPC---消息队列
- 多进程消息队列
- 消息和消息队列
- UNIX下进程学习之管道和消息队列
- 进程控制理论<四>--消息队列和信号量
- 进程-IPC 共享内存和消息队列 (三)
- linux先进程通信 管道方式和消息队列
- 管道和消息队列实现进程间通信
- 使用dom4j解析XML例子
- ATI 驱动教程
- 软件项目中的风险应对策略
- 数据封装格式
- 《希望井》
- 进程和消息队列
- 转载 rageliu 的 DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)
- 如何编制项目进度计划
- 如何在CodePlex 创建开源项目
- 项目的工作分解结构与活动的差异
- 乐观锁与悲观锁 (文章转自网上好像是玉米田的,忘记了)
- J2ME使用颜色
- 2分法-通用存储过程分页(top max模式)版本
- 将以前写的SQL 2分查找法 通用分页存储过程算法 改成.net类实现