易语言SendMessageTimeoutA同步发送消息设置超时

一般每个线程有两个队列:一个用来接收通过Send函数的消息,另外一个队列接收通过Post函数的消息。该两个函数的基本区别是:一个函数需要等待返回的,相当于函数调用,这个是SendMessage;另外一个是将消息放到对方的队列中,然后直接返回。

        使用PostMessage可能防止发送的线程给挂起,但有的时候我们必须通过SendMessage来发送消息(例如:WM_COPYDATA消息)。由于这种原因,就有可能会导致你的发送线程被接收线程的某些操作给挂起,这是很正常的。例如你给对方发送了这个消息,但这个时候刚好对方线程或进程结束了,那么SendMessage不会返回,这个时候你的程序很可能就会挂掉。

        使用 SendMessageTimeOut 可以帮助我们解决这个问题。我们可以设置一个等待时间,一般情况下,这个消息应该会在这个时间会返回,但异常情况就通过这个TIME来帮助我们返回,从而知道对象的线程挂起而避免自己被挂起。

【函数功能】:

        该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,并且,如果指定的窗口属于不同的线程,直到窗口程序处理完消息或指定的超时周期结束函数才返回。如果接收消息的窗口和当前线程属于同一个队列,窗口程序立即调用,超时值无用。

SendMessageTimeoutA函数原型

LRESULT SendMessageTimeout(HWND hwnd,
UINT Msg,
WPARAM wParam,
LPARAM IParam,
UINT fuFlags,
UIUT uTimeout,
LPDWORD lpdwResultult);

【参数说明】

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
fuFlags:指定如何发送消息。此参数可为下列值的组合:
SMTO_ABORTIFHUNG:如果接收进程处于“hung”状态,不等待超时周期结束就返回。
SMTO_BLOCK:阻止调用线程处理其他任何请求,直到函数返回。
SMTO_NORMAL:调用线程等待函数返回时,不被阻止处理其他请求。
SMTO_NOTIMEOUTIFNOTHUNG:Windows 95及更高版本:如果接收线程没被挂起,当超时周期结束时不返回。
uTimeout:为超时周期指定以毫秒为单位的持续时间。如果该消息是一个广播消息,每个窗口可使用全超时周期。例如,如果指定5秒的超时周期,有3个顶层窗回未能处理消息,可以有最多15秒的延迟。
IpdwResult:指定消息处理的结果,依赖于所发送的消息。
返回值:如果函数调用成功,返回非零值。如果函数调用失败,或超时,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果GetLastError返回零,表明函数超时。如果使用HWND_BROADCAST,SenddMessaggTimeout不提供单个窗口超时信息。

易语言API

.版本 2
 
.DLL命令 同步发送消息_, 整数型, "user32.dll", "SendMessageTimeoutA", , SendMessageTimeout,Long,成功时返回TRUE,失败时返回FALSE。会设置GetLastError
    .参数 窗口句柄, 整数型, , hwnd,要接收消息的一个窗口的句柄
    .参数 标识符, 整数型, , msg,消息的标识符
    .参数 消息1, 整数型, , wparam,由消息决定
    .参数 消息2, 整数型, , lparam,由消息决定
    .参数 类型, 整数型, , fuflags,下述常数的一个或多个SMTO_ABORTIFHUNG如目标进程挂起,则函数立即返回
    .参数 超时值, 整数型, , utimeout,超时值,采用毫秒为单位
    .参数 结果, 整数型, , lpdwresult,用于装载函数结果的一个变量

易语言前台调用测试

.版本 2
 
.程序集 窗口程序集_启动窗口
 
.子程序 _按钮_测试效果_被单击
 
信息框 (“测试效果按钮被点击了!, 0, )
 
.子程序 _按钮_发送消息_被单击
.局部变量 局部_结果, 整数型
 
同步发送消息_ (按钮_测试效果.取窗口句柄 (), 245, 0, 0, 0, 500, 局部_结果)

发布日期:

所属分类: 易语言 标签: