Tmemo在Midas中应用的问题(100分)

  • 主题发起人 主题发起人 woowoo
  • 开始时间 开始时间
W

woowoo

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的服务器程序中,有一个Tmemo控件,我想把客户端的请求显示出来,语句如下
log := datetostr(date)+' '+timetostr(time)+':'+str;
mmsg.Lines.Add( log);
if mmsg.Lines.Count > 300 then
mmsg.lines.Clear ;
但运行到mmsg.Lines.Add( log);时服务器程序就等待在哪里,执行不下去
请问是什么原因
 
从上面代码看没有什么不对的地方。
你能帖详细点吗?能确定执行到log赋值的那句吗?
 
log 仅仅为一个string
 
我知道是个string,
我是怀疑还没有执行到这句就出错,所以让你跟踪一下。
 
乡下人进城,见见世面先。
 
在服务端写一个函数,用来在MEMO中注册客户连接,在客户端中连midas时调用词函数即可,
不要在远程模块创建的过程中操作memo或其他控件,好像有些问题,我是自己写的服务器端过程,
在客户端调用。
 
是否因为服务器端是多线程,所以调用memo这种非多线程空件有问题,但使用Tlable没问题
 
不关代码的问题,woowoo, 你说到了问题的一点,但还差远。
因为你的多层系统中,服务器是多线程的,最重要的是,你对TMemo对象操作的代码
不是在主线程,而是在其他线程(这个改变不了,因为它是个服务线程),但非主线程
对VCL对象的操作是不安全的,所以你的跟踪在停在那里(如果把服务器运行起来,
服务器就会死掉,但服务还是可以继续的,不过在退出时会报读内存错误)。你应该改变
这种调用方式(即不能用服务线程自动调用操作VCL对象),而应在主线程中调用,例如,
你可以由用户自己去刷新服务器响应的客户端请求。
 
具体怎么解决,请指教
 
我不举了一个例子了吗?
就是建议你不要在服务线程向TMEMO对象写入客户端请求连接或服务的信息,而改由用户在他想查看信息时,
手动刷新,就象Windows的资源管理器的刷新一样。
 
TO woowoo:
另外,我还有一个比较好的方法告诉你:
你可以用向主线程进行线程同步的方法显示。具体是:在服务线程里,把对主线程的VCL
对象的操作都通过线程同步方法Synchronize(Method: TThreadMethod)向VCL对象写信息。
 
后退
顶部