紧急求救,多线程和VCl安全问题(200分)

  • 主题发起人 主题发起人 sportman
  • 开始时间 开始时间
S

sportman

Unregistered / Unconfirmed
GUEST, unregistred user!
紧急求救,多线程和VCl安全问题
我的程序是这样的:运行程序后,在主窗体的creatform中直接用begin
thread创建三四个
线程。每个线程都在不停地接收COM口传来的数据(实际上我用了八串口扩展卡,因为我
要接收多台其它机子的数据)。然后有许多richedit控件,将接收到的数据不断地显示
出来。在这许多控件中,有些是被某个线程独用的,有些是被多个线程共用的。
我的程序是要求永不停顿地运行的,在程序的任何地方我都没用endthread来结束这n个线
程(这有问题吗?)。
程序的异常现象是:
1、有时程序正在运行时,特别是多个com口传同时在传数据时,会兰屏掉。
2、更常见的是我退出,即主窗体的fromclose时,会兰屏。
我想知道的是:
1、大家常说的delphi中的vcl不是线程安全的,每个人的理解会有偏差,究竟是不同线
程用同一个vcl是不安全的呢还是一个线程用vcl就是不安全的呢?
2、在第1个问题的基础上,用begin
thread来创建线程是否不需考虑线程的同步问题?
要的话怎么样同步?因为我没有单独用delphi的Tthead来手工创建线程啊?
我的开发环境Pwin98se delphi5 用了flatstyle控件
要多少分请解答者自定。sportman@cmmail.com
 
关于这方面线程同步的有好多详细的贴子了,无外乎就是用syn..或用API的线程同步
 
最好是用TThread 来建立线程,不要用API建立线程(如果要用API建,要注意很多问题,
要重新设置一个全局变量,还有一些细小的问题,很麻烦,TThread帮你做了很多事),
如果你访问一些VCL可视组件,(TControl以下的,RichEdit当然也在其中)都要使用
保护方法来同步,原因很简单,DELPHI的VCL消息循环为了高效率没有进行保护处理,比如
互斥处理...
 
问题一:当然是不同的线程使用同一个VCL时是不安全的.
问题二:最好使用Delphi中的线程类使用多线程的,把要进行的对VCL的控件的
操作放在一个过程中,然后再synchronize(这个过程).
 
使用一个线程就会有冲突。
 
如果要用API建,要注意很多问题,要重新设置一个全局变量,还有一些细小的问题,
很麻烦,TThread帮你做了很多事)
要注意的问题有哪些呢?我看以前的贴子可还说用begin
thread可以不理其它的东西的?
是我理解不对?重新设置一个全局变量做什么用的?锁吗?
其它的方法我回去先试一下。
 
最好别用begin
thread的,Delphi的许多函数都有可重入和不可重入版本,
用TThread才能使用可重入的版本.
 
可重入和不可重入又是否可以详细解释一下呢?
 
我的对VCl的显示的操作有几个过程,DISPLAY1,DISPLAY2,DISPLAY3,DISPLAY4之类的。
synchronize的参数要求的参数是TThreadMethod啊,我synchronize(DISPLAYx)时,系统
会报错的啊!!!
另外,什么叫主线程?如果一个程序我没有人工创建线程,那这个程序本身是不是叫主线
程?若不是的话,那什么是?举个例子说明一下会更好的。
 
再问一句:在不同线程间的同一全局变量的操作需要进行同步操作吗?是否也要建立
专门的TthreadMethod来进行操作呢?要清楚我现在用的是begin
thread,整个程序中
根本就没有TThread这个字眼,变量需要同步的话,在这种情况下应如何操作呢?
我程序中存在不同线程操作同一全局变量的情况,那兰屏是否也可能会因为此引起的呢?
因为我试过我只开一个线程来处理主界面的一个VCL控件时,在数据量大时也可能会出现
兰屏情况。
 
你用TThread处理把,不要直接用API了,出了问题说明你功力还不够,老老实实用
线程类+保护方法+临界区把!
 
那这么说象begin
thread与endthread之类的方法就用不了了吗?我就是不想改已经完成的
程序才想找个修修补补的办法的.我没有研究过delphi,既然开发商提供了这种方法,那应
该可以正常用才好.
 
是啊,最好不要用API来建立线程
用线程类吧。
访问全局变量当然要同步,
这个方法在D7地帮助里说的很详细,有多种方法
顺便说一下:D7 DEVELOPERSGUIDE 就是D7帮助的PDF BAN BAN
 
你即然用了API来做线程,那就要相同的API的一些互斥和信号灯等来完成线程同步比较方便
 
谢谢大家的建议,问题好象解决了,计算机的问题从来就没有人可以有肯定的答案的.
现归纳如下:(个人意见)
1、delphi中VCL的线程不安全性是指多个线程在操作同一个VCL时产生的。
2、在多个线程中同时操作同一个简单变量应该没什么问题,可能是简单的加减等运算
在CPU的一条指令里即可完成吧,因为再多的线程CPu也是一条一条指令执行的,起
码我的程序里不停地改变,很长时间(N天)都没问题。
3、我最终还是懒得用TThread.create去亲自建立线程,仍用begin
thread来作,只不过
在线程中的无限循环中加进了break语句来结束线程,因为线程执行完了是肯定要退
出的,反而没用endthread来结束它,因为一用endthread反而会出问题,不求甚解,
我也不去理它了。
4、我在程序中摒弃了一切保持同步的技术,同时用begin
thread我的显示过程也无法用
syc...()这个同步函数来调用。也没有采用变量同步,只是用简单地标志变量加锁的
方法。
5、准备以后多线程时用TThread来建,可能会灵活些吧。
谢谢大家的意见了。
 
再次感谢大富翁们啦
 
呵呵,不好意思,由于大富翁论坛设计者们的失误,本人也是第一次给答题者分分,结
果虽然每人都给了分,但option选项还是停留在第一个把全部分给一个人上边,实际分
分结果如下:
诸:50
张无忌:50
dedema:80
xeen:10
bugcool:10(呵呵,因为bugcool最后一个发言,所以错把分全给他了)
大家可以来查我的另一个问题并答复,我再给在把分分给你们下去吧,对不起了。
 
后退
顶部