100分,关于控件的事件的问题,怎么处理比较好?

LinuxCard 2015-01-10 11:47:14
最近在看服务器端的icop的东西,也在网上找了一些例子来看,试图移植一下,发现有一些问题,主要是关于事件的触发的问题:

打个比方,iocp是多个线程协同处理数据的,如果其中一个线程收到了数据,那么会调用onreceive事件来通知应用程序,问题来了,由于是线程收到了数据,那么依然是由线程来调用OnReceive事件,这样就会导致OnReceive里面写的代码不能操作VCL界面控件

还有一种方法,就是线程收到数据后,sendmessage给控件创建的一个不可见窗口,然后在这个窗口的消息处理代码里调用OnReceive,这样,数据的处理就提升到了主线程,在这里面可以对VCl界面控件操作。但是这样有个问题,就是线程在处理完成前是暂停的,如果处理的慢的话,很快,所有的线程都会被阻塞在SendMessage那里,性能会很低


不知道有什么办法解决这个问题?
...全文
165 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2015-01-13
  • 打赏
  • 举报
回复
线程不能操作VCL界面控件,只有发消息,让主线程处理VCL界面控件。
haitao 2015-01-13
  • 打赏
  • 举报
回复
服务端、多线程,尽量不要涉及界面 界面是不精确的,0.5秒更新一次即可,数据可是必须尽快更新的
  • 打赏
  • 举报
回复
1,可以同步 OnReceive 代码 Syncronize(DoRecive) procedure DoRecive(); begin if assigned(FOnReceive ) then FOnReceive(xxxxx); end; 2,可以用PostMessage, PostMessage立即返回
Playmaster 2015-01-13
  • 打赏
  • 举报
回复
引用 3 楼 LinuxCard 的回复:
[quote=引用 1 楼 Playmaster 的回复:] 在线程中处理数据,然后用postmessage向主窗口发消息,将处理的数据在界面上呈现出来。 虽然postmessage有些滞后,但是不会中断线程处理数据,可以及时响应网络请求。
iocp里面只做接收数据的操作,至于处理数据什么的,那是以后的事情了,现在考虑的是iocp收到数据后,如何通知组件?是在线程中调用OnReceive函数来通知,还是由线程SendMessage给组件的隐形窗口? PostMessgae会丢失数据,所以不再考虑的范围内[/quote] PostMessage会丢失数据? 难道你的窗口消息队列满了?
LinuxCard 2015-01-12
  • 打赏
  • 举报
回复
引用 1 楼 Playmaster 的回复:
在线程中处理数据,然后用postmessage向主窗口发消息,将处理的数据在界面上呈现出来。 虽然postmessage有些滞后,但是不会中断线程处理数据,可以及时响应网络请求。
iocp里面只做接收数据的操作,至于处理数据什么的,那是以后的事情了,现在考虑的是iocp收到数据后,如何通知组件?是在线程中调用OnReceive函数来通知,还是由线程SendMessage给组件的隐形窗口? PostMessgae会丢失数据,所以不再考虑的范围内
不得闲 2015-01-12
  • 打赏
  • 举报
回复
可以在IOCP的线程中接收他的接收数据,然后接收到的数据包已经符合到了自己的协议数据大小,就直接提取出来,然后再准备一个线程池,提取出来之后,就直接把这个回收处理任务交给这个线程池中线程去处理,这样就不用在意IOCP的接收线程被堵塞住了,访问UI神马的,直接按照线程同步的各种方法去处理就行
Playmaster 2015-01-12
  • 打赏
  • 举报
回复
在线程中处理数据,然后用postmessage向主窗口发消息,将处理的数据在界面上呈现出来。 虽然postmessage有些滞后,但是不会中断线程处理数据,可以及时响应网络请求。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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