大侠高手看过来,多线程中对界面的操作问题.

Hover 2002-08-20 05:58:43
多个线程拥有一个窗口的句柄,多个线程对这个句柄进行SetTimer,KillTimer,PostMessage操作时会不会出问题?

欢迎讨论,二百分奉上.先谢谢了
...全文
18 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
glhorse 2002-08-30
  • 打赏
  • 举报
回复
我使用SendMessage的时候好想也有问题,有时主线程没法想应发送的消息。/。。
sunbo 2002-08-30
  • 打赏
  • 举报
回复
Hover(翔)(中国鹰派联盟成员) 怎么不发言了?
sunbo 2002-08-20
  • 打赏
  • 举报
回复
看看MSDN吧!SetTimer被其它线程(非创建线程)使用是错误的,如下:

SetTimer
The SetTimer function creates a timer with the specified time-out value.

UINT_PTR SetTimer(
HWND hWnd, // handle to window
UINT_PTR nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // timer procedure
);
Parameters
hWnd
[in] Handle to the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.

注意!!!!!!!!!1
这个窗口句柄必须被调用线程拥有(This window must be owned by the calling thread)

兄弟们,可不能随声附和啊!
他乡异客1 2002-08-20
  • 打赏
  • 举报
回复
同意 Hover(翔)(中国鹰派联盟成员) 的看法
sunbo 2002-08-20
  • 打赏
  • 举报
回复
还有一种方法,定义lpTimerFunc函数
KillTimer时使用SetTimer的返回值,如下使用NULL窗口句柄

UINT_PTR SetTimer(
NULL, // handle to window
UINT_PTR nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // timer procedure
);
jfzsl 2002-08-20
  • 打赏
  • 举报
回复
gz
sunbo 2002-08-20
  • 打赏
  • 举报
回复
你想做的还是可配置的定时问题。
我建议由一个线程专门负责定时工作(以后简称定时线程),其它需要定时消息的线程实现一个自定义消息(如WM_MYTIMEOUT)用于接收定时线程的消息。其它线程通过发送消息将线程ID传给定时线程,用于注册(包括定时的长度和次数)和取消注册,由定时线程启动所有的时间消息,时间到后 PostThreadMessage (WM_MYTIMEOUT)。
sunbo 2002-08-20
  • 打赏
  • 举报
回复
前面有点错误,更正如下:

窗口属于它的创建线程,其它的线程向窗口PostMessage没问题,因为首先会到创建线程的消息队列,然后再Dispatch到窗口。不知你在别的线程利用此窗口句柄 SetTimer、KillTimer想干什么?
sunbo 2002-08-20
  • 打赏
  • 举报
回复
窗口属于它的创建线程,其它的线程PostMessage没问题,因为首先会到的消息队列,然后再Dispatch到窗口。不知你在别的线程利用此窗口句柄 SetTimer、KillTimer想干什么?
MungBean 2002-08-20
  • 打赏
  • 举报
回复
关注
gameboy999 2002-08-20
  • 打赏
  • 举报
回复
::SetTimer(g_hWnd,xxx,xxx)同样是发消息给窗体的,不是马上执行的,所以一样没有问题。
Hover 2002-08-20
  • 打赏
  • 举报
回复
楼上的兄弟,不错,对同一窗口进行SetTimer,KillTimer,PostMessage操作,最终都会以消息方式执行主线程中的消息处理代码,处理这些操作产生的消息不会有问题

但是这是在多线程中对同一窗口句柄进行操作,在进行这些操作时会有问题吗?
gameboy999 2002-08-20
  • 打赏
  • 举报
回复
我觉得多线程对界面的SetTimer,KillTimer,PostMessage操作都不会有问题

因为SetTimer,KillTimer,PostMessage根本上都是发送消息到窗体的独立的消息队列中去,而窗体获取消息则是GUI线程独立运行,从本质上来讲,这些操作最终都是会成为单线程操作,

所以,基本上不用担心,除非你是对file,list等全局对象直接操作,不然就不会有问题
tyro_zhang 2002-08-20
  • 打赏
  • 举报
回复
可不可以使用一全局变量通过信号灯机制?
Hover 2002-08-20
  • 打赏
  • 举报
回复
如果不用互斥呢?
sans 2002-08-20
  • 打赏
  • 举报
回复
最后使用互斥的方法。

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧