本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。
本篇文章给大家谈谈事件通知函数,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享事件通知函数的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
C#事件、行为、方法、函数的区别
C#中没有行为这个概念 而事件
事件通知函数,方法
事件通知函数,函数则有
事件,指的是一个类有可能会引发的一个调用,任何类都可以向一个有事件的类注册这个事件的监听,那么当事件引发时,类就会受到事件通知,从而响应。
方法,指的是一个类的一些操作,比如一个Car类
事件通知函数他有一个Move的移动方法,表示这个车子可以移动的操作(Operation)。
函数,在C#里没有太严格的定义,我的理解是静态方法都可以称之为函数,因为函数一般不和类的实例相关,而静态方法具有这个特性。函数一般代表一个子操作,他会执行一些计算或者其他纯代码性的过程,比如Math类具有很多算数学的函数,比如计算三角的函数。
VB中alert是什么意思啊
VB中无alert关键词,它是Microsoft的其它编程语言或SQL Server中广泛用于报警的。
Alert对象
警报对象属性的方法列出集合
警报对象包含所有定义的SQL Server警报的信息。
Microsoft JScript中的提供两种方式来直接在浏览器中显示的数据。可以使用write()和writeln(),这是该文档对象的方法。也可以显示在浏览器中的表单信息,并在警报,提示和确认消息框。
编写脚本的脚本对象
对使用脚本对象模型和设计时控件的主要优点是易于编写定义应用程序的行为脚本。该脚本对象模型,使用的网页一样工作形式微软的Visual Basic或Microsoft访问。拖着设计时控件拖到页面后,可以使用熟悉的脚本技术来设置其属性,并编写处理事件。
然而,存在与脚本对象模型的工作,并与其他环境中工作之间的一些差异。在下面的章节中,会发现怎么写剧本,剧本的对象,包括在哪里,需要知道从其他环境中的不同信息。
扩展活动的对象
每个脚本对象已预定,或隐式,设置它可以响应事件。但是,你可能要采取的浏览器会产生其他事件的优势,并利用它们与你的脚本对象。
最典型的是,如果使用的是设计时的控制和目标脚本平台为客户端,可能要采取的DHMTL文档对象模型中可用的活动项目。例如,文本框脚本对象支持,可以写处理程序的隐式onchange事件。然而,在客户端上也可能要编写的onkeypress事件事件和其他事件。
可以通过一个事件通知,或登记该对象在事件发生时被通知延长集可用事件到对象。当劝告一个事件,可以编写事件处理程序的事件(该对象),会为任何其他事件。可以通过unadvising事件取消事件通知。
每个对象都支持一个通知方法,它允许注册一个特定的事件。当提醒,指定事件的名称和事件发生时,将调用函数的名称 - 实际上,该事件处理事件的名称。
WSAAsyncSelect()的事件
重新通知函数
FD_READ recv()或recvfrom()
FD_WRITE send()或sendto()
FD_OOBrecv()
FD_ACCEPTaccept()
FD_CONNECT无
FD_CLOSE 无
任何对重新通知函数的调用,即使失败,也会达到为相关事件发重新通知消息的效果.
对FD_READ,FD_OOB和FD_ACCEPT事件,消息传递是"水平触发"(level-triggered)的.这意味着,若调用了重新通知函数并且相关的事件对该调用仍有效,WSAAsyncSelect()消息就将传给应用程序.这为应用程序提供了事件驱动以及不必考虑在任一时刻到达的数据量的能力.考虑下列序列:
(i) Windows Sockets DLL在套接口s上接收100字节的数据并传递一个FD_READ消息.
(ii) 应用程序启动recv(s,buffptr,50,0)接收50字节.
(iii) 由于仍有数据未读,Windows Sockets DLL发送另一个FD_READ消息.
根据以上语义,应用程序不必在收到FD_READ消息时读进所有可读的数据-对应于每一FD_READ消息进行一次recv()调用是恰当的.如果应用程序为一个FD_READ消息而启动了多个recv()调用,它将接收到多个FD_READ消息.这样的应用程序可能希望在开始recv()调用(通过不为FD_READ事件置位的WSAAsyncSelect()函数调用)之前关闭FD_READ消息.
如果在应用程序初次调用WSAAsyncSelect()或当调用了重新通知函数时,有一个事件为真,则会发送一个相应的消息.例如,若应用程序调用listen(),就会试图进行连接,然后应用程序调用WSAAsyncSelect()声明它需要为套接口接收FD_ACCEPT消息,Windows Sockets的实现就会立即传递一个FD_ACCEPT消息.
FD_WRITE事件处理起来稍有不同.FD_WRITE消息是在套接口第一次用connect()连接或由accept()接受,并且在send()或sendto()以WSAWOULDBLOCK错误失败后缓冲区空闲时发送的.因此,应用程序可以假设发送可能在第一次FD_WRITE消息时开始,并持续到一次返回WSAEWOULDBLOCK的发送. 在这样的失败后,应用程序将被通知,FD_WRITE消息的发送又将可能.
FD_OOB事件只用在当套接口配置成独立接收带外数据时.如果一个套接口被配置成接收感兴趣的带外数据状态,带外数据将和普通数据等同视之,并且应用程序应该注册它感兴趣的方面,然后将接收FD_READ事件,而不是FD_OOB事件.应用程序可以设置或监控带外数据处理的方法(通过使用setsockopt()或getsockopt()函数,及SO_OOBINLINE选项).
在FD_CLOSE消息中的错误代码指出套接口的关闭是正常的还是异常的.如果错误代码是0,则关闭是正常的;若错误代码是WSAECONNRESET,则套接口的虚套接口将被重置.这些只对SOCK_STREAM类型的套接口起作用.
FD_CLOSE消息在相应套接口的虚电路关闭指令接收到时发送.在TCP术语中,这意味着FD_CLOSE在连接进入了FIN WAIT或CLOSE WAIT状态时发送.这是远端对发送方进行了shutdown()调用或closesocket()调用的结果.
请注意你的应用程序将只会收到FD_CLOSE消息来指出虚电路的关闭.它不会收到FD_READ消息来表示该状况.
WSAAsyncSelect如何使用?
WSAAsyncSelect是个最简单的socket io模型.我学习socket时比较喜欢的异步io模型.
Winsock 提供了一个有用的异步I/O模型。利用这个模型
事件通知函数,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。具体的做法是在建好一个套接字后,调用WSAAsyncSelect函数。该模型最早出现于Winsock的1.1版本中,用于帮助应用程序开发者面向一些早期的16位 Windows平台(如Windows for Workgroups),适应其“落后”的多任务消息环境。应用程序仍可从这种模型中得到好处,特别是它们用一个标准的Windows例程(常称为 "WndProc"),对窗口消息进行管理的时候。该模型亦得到了Microsoft Foundation Class(微软基本类,MFC)对象CSocket的采纳。(节选自《Windows网络编程》第八章)
我还是先贴出代码,然后做详细解释:
#include <winsock.h
#include <tchar.h
#define PORT 5150
#define MSGSIZE 1024
#define WM_SOCKET WM_USER+0
#pragma comment(lib, "ws2_32.lib")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = _T("AsyncSelect Model");
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass(wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("AsyncSelect Model"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(msg, NULL, 0, 0))
{
TranslateMessage(msg) ;
DispatchMessage(msg) ;
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
WSADATA wsd;
static SOCKET sListen;
SOCKET sClient;
SOCKADDR_IN local, client;
int ret, iAddrSize = sizeof(client);
char szMessage[MSGSIZE];
switch (message)
{
case WM_CREATE:
//初始化Socket库
WSAStartup(0x0202, wsd);
// 创建监听的socket
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 绑定socket
local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(PORT); //指定监听端口
bind(sListen, (struct sockaddr *)local, sizeof(local));
// 监听
listen(sListen, 3);
// 注册监听socket FD_ACCEPT事件,当 监听socket 有客户连接时,会发送窗口消息WM_SOCKET给本窗口
WSAAsyncSelect(sListen, hwnd, WM_SOCKET, FD_ACCEPT);
return 0;
case WM_DESTROY:
closesocket(sListen);
WSACleanup();
PostQuitMessage(0);
return 0;
case WM_SOCKET:
if (WSAGETSELECTERROR(lParam))
{
closesocket(wParam);
break;
}
switch (WSAGETSELECTEVENT(lParam)) //分析WM_SOCKET的消息类型
{
case FD_ACCEPT:
// 接受一个客户连接
sClient = accept(wParam, (struct sockaddr *)client, iAddrSize);
// 注册客户socket FD_READ 和 FD_CLOSE 事件
WSAAsyncSelect(sClient, hwnd, WM_SOCKET, FD_READ | FD_CLOSE);
break;
case FD_READ:
ret = recv(wParam, szMessage, MSGSIZE, 0);
if (ret == 0 || ret == SOCKET_ERROR WSAGetLastError() == WSAECONNRESET)
{
closesocket(wParam);
}
else
{
szMessage[ret] = '\0';
send(wParam, szMessage, strlen(szMessage), 0);
}
break;
case FD_CLOSE:
closesocket(wParam);
break;
default: //默认消息,也可以认为socket断开.
closesocket(wParam);
break;
}
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
在我看来,WSAAsyncSelect是最简单的一种Winsock I/O模型(之所以说它简单是因为一个主线程就搞定了)。使用Raw Windows API写过窗口类应用程序的人应该都能看得懂。这里,我们需要做的仅仅是:
1.在WM_CREATE消息处理函数中,初始化Windows Socket library,创建监听套接字,绑定,监听,并且调用WSAAsyncSelect函数表示我们关心在监听套接字上发生的FD_ACCEPT事件;
2.自定义一个消息WM_SOCKET,一旦在我们所关心的套接字(监听套接字和客户端套接字)上发生了某个事件,系统就会调用WndProc并且message参数被设置为WM_SOCKET;
3.在WM_SOCKET的消息处理函数中,分别对FD_ACCEPT、FD_READ和FD_CLOSE事件进行处理;
4.在窗口销毁消息(WM_DESTROY)的处理函数中,我们关闭监听套接字,清除Windows Socket library
下面这张用于WSAAsyncSelect函数的网络事件类型表可以让
事件通知函数你对各个网络事件有更清楚的认识:
表1
FD_READ 应用程序想要接收有关是否可读的通知,以便读入数据
FD_WRITE 应用程序想要接收有关是否可写的通知,以便写入数据
FD_OOB 应用程序想接收是否有带外(OOB)数据抵达的通知
FD_ACCEPT 应用程序想接收与进入连接有关的通知
FD_CONNECT 应用程序想接收与一次连接或者多点join操作完成的通知
FD_CLOSE 应用程序想接收与套接字关闭有关的通知
FD_QOS 应用程序想接收套接字“服务质量”(QoS)发生更改的通知
FD_GROUP_QOS 应用程序想接收套接字组“服务质量”发生更改的通知(现在没什么用处,为未来套接字组的使用保留)
FD_ROUTING_INTERFACE_CHANGE 应用程序想接收在指定的方向上,与路由接口发生变化的通知
FD_ADDRESS_LIST_CHANGE 应用程序想接收针对套接字的协议家族,本地地址列表发生变化的通知
如何使用CH341PtSetDevNotify这个函数
iNotifyRoutine 只是一个参数
事件通知函数,
函数是这样
事件通知函数的:
BOOL WINAPI CH341SetDeviceNotify(ULONG iIndex, PCHAR iDeviceID, mPCH341_NOTIFY_ROUTINE iNotifyRoutine);
如果 iNotifyRoutine 为 NULL,就取消事件通知
如果 iNotifyRoutine 不为 NULL,就在检测到事件时调用 iNotifyRoutine
C#下调用和其他函数一样
关于事件通知函数和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
事件通知函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、事件通知函数的信息别忘了在本站进行查找喔。
暂时没有评论,来抢沙发吧~