寻找Delphi高手 好像只能用Dispaching 了。 不过你可以捕获消息嘛,非要自己定义么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 很简单,把你的TComponent封装到一个单独的线程中,然后保存线程的ID;其他的线程如果要发消息的话用PostThreadMessage就搞定,具体查WinAPI帮助。还有些注意事项:一个线程只有调用了任何一个USER或GDI的函数之后才会建立消息队列,你需要很巧妙地完成这个过程。 TO Nicrosoft:没有窗口为什么不能接收消息呢?那线程没有窗口,也能接收消息啊!TO 小海:如何捕获?TO eDRVIE:实际上我正是在解决子线程和主线程的通信问题,象你这样两个线程倒是好通信,但你的线程又如何与主线程通信呢? 线程间的通信,可以用消息队列, 消息队列,顾名思义是一个队列,实现了特定的队列存取规则,windows的消息队列也是如此, 你要的是一个自定义消息队列,又何必用作一个跟系统相关的呢?而且会跟系统消息有冲突。 自定义消息队列可以用stringlist来实现,只是存取的时候要进行必要的同步! to EvilRoach: 子线程和主线程通信当然没有任何问题。提示你一下:主线程有没有Form?有没有窗体?有没有窗体句柄?为什么不用PostMessage?to airhorse: 其实不需要那么麻烦,用Windows本身的PostThreadMessage就非常方便,而且系统会自动避免所有潜在的访问冲突 由于不是继承于TWinControl,没有窗体,确实不能用PostMessage , SendMessage or Perform , 但是,由于你用了TTable的派生类,如果你是想改变控件一些方法的执行,完全可以捕获VCL继承类的消息。别忘了,VCL包含了大量的内部消息,这些内部消息往往以CM_打头(不同于SM_)可以管理VCL内部事务,如焦点,颜色,拖放等。我不知道你向捕获的是那方面的消息。不过你可以试试看帮助 "Component Writer" 部分,当然也可以查找消息方面的。具体捕获方法与系统消息的捕获无异,你该知道吧? 不过你也可以试一试PostThreadMessage,应该也可以.不过你用PostThreadMessage是有点要注意的: 最好建立一个消息队列,否则,如果返回值她不会在处理了,也会随带一个错误。 当然不见里消息队列也有办法:如果返回值失败 调用Sleep函数然后再次调用PostThreadMessage直到成功。 to eDRIVE(EncoreUneFois):>>to EvilRoach: 子线程和主线程通信当然没有任何问题。提示你一下:主线程有没有Form?有没有窗体?有没有窗体句柄?为什么不用PostMessage?>>to airhorse: 其实不需要那么麻烦,用Windows本身的PostThreadMessage就非常方便,而且系统会自动避免所有潜在的访问冲突同意eDRIVED的后一个意见,我也更倾向于使用系统消息机制,好处不言而喻!对于您的前一个提示,老兄,想想我是在作组件,总不能让我的每个组件用户都去改他们的FORM吧,那我作组件干吗? to hpn_cao(小海):>>由于不是继承于TWinControl,没有窗体,确实不能用PostMessage , SendMessage or Perform , 但是,由于你用了TTable的派生类,如果你是想改变控件一些方法的执行,完全可以>>捕获VCL继承类的消息。别忘了,VCL包含了大量的内部消息,这些内部消息往往以CM_打头(不同于SM_)可以管理VCL内部事务,如焦点,颜色,拖放等。我不知道你向捕获的是那方面的消息。>>不过你可以试试看帮助 "Component Writer" 部分,当然也可以查找消息方面的。>>具体捕获方法与系统消息的捕获无异,你该知道吧?其实,你说的这些“内部消息”都是通过Dispatch来传诵的,而我们现在正是不能使用Dispatch(因为多线程问题)。>>不过你也可以试一试PostThreadMessage,应该也可以.....我需要接受消息的对象是一个组件,你在另一个线程中怎么用PostThreadMessage向它发消息?PostThreadMessage只有几个参数:ThreadID,MessageID, wParam, lParam。Application收到你的消息之后,怎么就知道应该把这个消息送给我的组件? 我曾经在LMD的源程序中发现一些解决这类问题的办法,而且和你的情况完全相同(非WinControl组件接受消息)它的解决方法是内部生成一个隐含窗口实例(用API的CreateWindowEx),在窗口处理函数中完成消息Dispatch的功能,对外部而言(或者是对组件的其他部分),可以模拟给窗口发消息来完成。但是源程序的具体位置很早就遗忘了:(,所以我现在没法贴出来。不过看看LMD的源程序,很有帮助的。 哈哈哈哈!!!!我就是用的这个办法。而且非常简单,不用去看LMD的辕马。重新申明一个FORM类,比如叫TMsgForm,然后我的组件包括一个这样的TMsgForm对象,自始至终都不Show这个窗口,然后我想收什么消息就收什么消息。而且在我具体实现的代码中,TMsgForm不是继承自TForm,是TWinControl,已经足够了。还有哪位有高见呢? to EvilRoach:幸亏你没有用FORM类继承,呵呵,否则拖泥带水又莫名其妙地让目标代码增大100多K可不是空想更好的方法就是CreateWindowEx,再加上一个窗口过程,加起来不会超过1K的代码,完成你的要求绰绰有余。 请问如何做这样的界面呢? 关于RTTI,能给个最简单的例程么? dephi插入PostgreSQL数据库的问题! 注册表操作中的openkey会触发异常吗 如何提取本机系统的日期时间分隔符? 再加100分,熟悉vcl消息处理机制的进来帮个忙!马上结贴! 请问谁有设备管理软件的源码 求助ADOQuery中数据选择的问题,高分,在线等 有两个捡分的问题,大家快来呀(菜鸟问) Delphi,爱你是一条不归路……(一篇精彩的文章和提问) 请教,ADO sp1在那下载!!!!!!急!!!!!!!!! 初学者的呼唤?
但你的线程又如何与主线程通信呢?
消息队列,顾名思义是一个队列,实现了特定的队列存取规则,windows的消息队列也是如此,
你要的是一个自定义消息队列,又何必用作一个跟系统相关的呢?而且会跟系统消息有冲突。 自定义消息队列可以用stringlist来实现,只是存取的时候要进行必要的同步!
捕获VCL继承类的消息。别忘了,VCL包含了大量的内部消息,这些内部消息往往以CM_打头(不同于SM_)可以管理VCL内部事务,如焦点,颜色,拖放等。我不知道你向捕获的是那方面的消息。
不过你可以试试看帮助 "Component Writer" 部分,当然也可以查找消息方面的。
具体捕获方法与系统消息的捕获无异,你该知道吧?
不过你用PostThreadMessage是有点要注意的: 最好建立一个消息队列,否则,如果返回值她不会在处理了,也会随带一个错误。 当然不见里消息队列也有办法:
如果返回值失败 调用Sleep函数然后再次调用PostThreadMessage直到成功。
>>to EvilRoach: 子线程和主线程通信当然没有任何问题。提示你一下:主线程有没有Form?有没有窗体?有没有窗体句柄?为什么不用PostMessage?
>>to airhorse: 其实不需要那么麻烦,用Windows本身的PostThreadMessage就非常方便,而且系统会自动避免所有潜在的访问冲突同意eDRIVED的后一个意见,我也更倾向于使用系统消息机制,好处不言而喻!
对于您的前一个提示,老兄,想想我是在作组件,总不能让我的每个组件用户都去改他们的FORM吧,那我作组件干吗?
>>由于不是继承于TWinControl,没有窗体,确实不能用PostMessage , SendMessage or Perform , 但是,由于你用了TTable的派生类,如果你是想改变控件一些方法的执行,完全可以
>>捕获VCL继承类的消息。别忘了,VCL包含了大量的内部消息,这些内部消息往往以CM_打头(不同于SM_)可以管理VCL内部事务,如焦点,颜色,拖放等。我不知道你向捕获的是那方面的消息。
>>不过你可以试试看帮助 "Component Writer" 部分,当然也可以查找消息方面的。
>>具体捕获方法与系统消息的捕获无异,你该知道吧?
其实,你说的这些“内部消息”都是通过Dispatch来传诵的,而我们现在正是不能使用Dispatch(因为多线程问题)。>>不过你也可以试一试PostThreadMessage,应该也可以.....
我需要接受消息的对象是一个组件,你在另一个线程中怎么用PostThreadMessage向它发消息?
PostThreadMessage只有几个参数:ThreadID,MessageID, wParam, lParam。
Application收到你的消息之后,怎么就知道应该把这个消息送给我的组件?
它的解决方法是内部生成一个隐含窗口实例(用API的CreateWindowEx),在窗口处理函数中完成消息Dispatch的功能,对外部而言(或者是对组件的其他部分),可以模拟给窗口发消息来完成。但是源程序的具体位置很早就遗忘了:(,所以我现在没法贴出来。不过看看LMD的源程序,很有帮助的。
我就是用的这个办法。
而且非常简单,不用去看LMD的辕马。重新申明一个FORM类,比如叫TMsgForm,然后我的组件包括一个这样的TMsgForm对象,
自始至终都不Show这个窗口,然后我想收什么消息就收什么消息。
而且在我具体实现的代码中,TMsgForm不是继承自TForm,是TWinControl,已经足够了。还有哪位有高见呢?
幸亏你没有用FORM类继承,呵呵,否则拖泥带水又莫名其妙地让目标代码增大100多K可不是空想更好的方法就是CreateWindowEx,再加上一个窗口过程,加起来不会超过1K的代码,完成你的要求绰绰有余。