c语言消息队列
Ⅰ c语言的switch(Msg)
WNDCLASSEX是一个包含窗体各种参数的结构体,例如窗口风格(是模态、非模态、有无系统菜单、有无边框等等),窗体实例句柄,窗体消息处理函数等等.
WNDCLASSEX在winuser.h中被定义
typedef WNDCLASSEXW WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX;
而WNDCLASSEXW也在winuser.h中被定义为:
typedef struct _WNDCLASSEXW {
UINT cbSize;//WNDCLASSEX 的大小
UINT style;//窗口风格
WNDPROC lpfnWndProc;//窗体消息处理函数的指针
int cbClsExtra;//紧跟在窗口类结构后的附加字节数
int cbWndExtra;//跟在窗口实例后的附加字节数
HINSTANCE hInstance;//窗体实例句柄
HICON hIcon;//窗体图标句柄
HCURSOR hCursor;//光标句柄
HBRUSH hbrBackground;//背景画刷背景
LPCWSTR lpszMenuName;//菜单名的const wchar_t类型的指针
LPCWSTR lpszClassName;//类名的const wchar_t类型的指针
HICON hIconSm;//和窗口类关联的小图标
} WNDCLASSEXW, *LPWNDCLASSEXW, *PWNDCLASSEXW;
HWND是窗体的句柄类型
在windef.h中被定义
DECLARE_HANDLE(HWND);
而在winnt中有#define DECLARE_HANDLE(n) typedef HANDLE n
和#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
MSG是Windows消息的结构体,当产生消息时被推送到消息队列,等待处理,例如右击时会生成右击消息的MSG,消息会记录接收消息的窗体的句柄,和消息类型:WM_RBUTTONDOWN,消息产生时的鼠标的坐标,把消息投递到消息队列,Windows会把消息一条条地取出,根据接收者投递给它们的消息处理函数
LRESULT CALLBACK WindowProcere (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
witch (message)
{
...
}
}
MSG在winuser.h中被定义为
typedef struct tagMSG {
HWND hwnd;//接收消息的窗体的句柄
UINT message;//消息ID, 例如WM_CLOSE、WM_MOUSEMOVE
WPARAM wParam;//消息参数, 含义随message的不同而不同
LPARAM lParam;//消息参数, 含义随message的不同而不同
DWORD time;//消息投递到消息队列的时间
POINT pt;//产生消息时鼠标的坐标
} MSG,*LPMSG,*PMSG;
Ⅱ aix系统,c语言,发送消息队列返回报错error=11
当发送端速度超过接收端时,队列可能填满。IPC_NOWAIT说明发送端是无阻塞的,这时就会临时返回失败。可以等一段时间再次调用msgsnd。
Ⅲ C语言链表和栈,还用队列分别用于什么场合,请专业人士具体解说一下!
通常链表支持线性时间查找,线性时间访问,常数时间插入,常数时间删除,比较适合需要多次在中间插入和删除的场合
栈(stack)遵循先进后出原则(FILO),可用于模拟仓储,递归,深搜等其他符合FILO的模型
队列(queue)遵循先进先出原则(FIFO),可用于模拟排队,流,消息队列等符合FIFO的模型
其他具体情况就要视需要而定了
Ⅳ C语言中,队列是什么意思,有什么用途
队列是一种特殊的线性表。
队列一种可以实现“先进先出”的存储结构,即“一端入,一端出”,队首(front)出队,队尾(rear)入队,若front指向队首,则rear指向队尾最后一个有效元素的下一个元素;若rear指向队尾,则front指向队首第一个有效元素的下一个元素。
队列特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
(4)c语言消息队列扩展阅读
循环队列各个参数的含义
1、队列初始化front和rear的值都是零,初始化时队列就是空的。
2、队列非空front代表队列的第一个元素rear代表了最后一个有效元素的下一个元素。
3、队列空front和rear的值相等,但是不一定是零。
Ⅳ 关于c语言中消息队列发送的结构体
消息队列正常定义的type类型就是long,你看看是不是你定义的有问题。
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
struct msgbuf
{
long type;//类型
char buf[1024];
};
int main()
{
int msgid;
msgid=msgget(0x1000,IPC_CREAT | 0777);
struct msgbuf mb={1,"hello world"};
int ret;
ret=msgsnd(msgid,&mb,sizeof(struct msgbuf)-sizeof(long),0);
//这里的长度不包括类型的大小
}
Ⅵ linux c语言进程间通信疑问,上述程序只是想父进程创建一个消息队列,发给子进程消息,但是为什么没有成功
把
if((msgid=msgget(IPC_PRIVATE,0666))==-1)
{
printf("error111");
exit(0);
}
放到fork()函数之前就可以了。
创建消息队列需要在fork()之前,因为fork()产生的是两个进程,他们的资源是相互独立的。
fork()之后创建的消息队列,另一个进程不能识别。
Ⅶ C语言中postmessage的参数是什么,有没有使用的例子
函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); 函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。参数: hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
Ⅷ C语言自定义消息函数的等待怎么写
消息队列的等待就是GetMessage,没办法自己写,除非你打算改Windows本身。这个函数如果没有消息进来就会释放CPU,如果不希望等待用PeekMessage。消息循环的格式是固定的。