问题1:
在多线程里,用Synchronize把所有要执行的代码放在主线程里做,这样子是不是实现了多线程?
问题2:
我现在做了4个线程,而每个线程里都有个控件操作比较大,几乎全在使用那个控件,如果要使用全局变量,这样子明显不现实,请问有那种方式还能实现?
问题3:
我做的项目是这样子的:
是一个对串口操作显示大屏的程序.要求程序打开后,让4个大屏都显示待机画面,也就是用到了刚才我说的那个控件操作比较多的那个控件.然后程序没隔1秒对数据库操作,大屏显示处理数据库后的数据,要求4个大屏不能影响.所以我想应该用到多线程.请高手们给个思路或建议.急!!!谢谢了.

解决方案 »

  1.   

    不一定要用多线程。用4个Timer应该可以满足你的要求。
      

  2.   

    问题1: 你这样虽然写的是多线程, 但比单线程效率还低.
    问题2: 在子线程中进行GUI相关操作是危险的, 所以GUI要关操作一般使用Synchronize在主线程中执行。但楼主请注意,这里指的是GUI相关操作,而并非指控件操作。非GUI的控件,可以在子线程中进行操作的。 
    问题3:对于串口的操作,可以在子线程中进行的。你可以使用4个线程,每对线程对应一个显示大屏;对于控件,如果能使用四个独立的控件更好,如果不能,那在线程中对于此控件互斥访问即可。
      

  3.   


    问题1:
    在多线程里,用Synchronize把所有要执行的代码放在主线程里做,这样子是不是实现了多线程?
       多线程和你这里提问的Synchronize没有本质关联。使用Synchronize是因为大多数VCL在被设计时,都只考虑了在任何时刻只有一个线程来访问它。其局限性尤其体现在VCL的用户界面部分。同时,一些非用户界面部分也不是线程安全的。所以DELPHI中提供了一个叫Synchronize方法,Synchronize( )把由Method参数传递过来的方法保存在TThread的FMethod字段中,然后,给线程窗口发一个CM_EXECPROC消息,并且把消息的lParam参数设为self(这里指线程对象)。当线程窗口的窗口过程收到这个消息后,它就调用FMethod字段所指定的方法。由于线程窗口是在主线程内创建的,线程窗口的窗口过程也将被主线程执行。
    问题2:
    我现在做了4个线程,而每个线程里都有个控件操作比较大,几乎全在使用那个控件,如果要使用全局变量,这样子明显不现实,请问有那种方式还能实现?
       这个跟你的设计有关,你所谓的“控件操作比较大”我没看太明白,如果说要使用全军变量并且设计到多个线程的访问,记得同步。问题3:
    我做的项目是这样子的:
    是一个对串口操作显示大屏的程序.要求程序打开后,让4个大屏都显示待机画面,也就是用到了刚才我说的那个控件操作比较多的那个控件.然后程序没隔1秒对数据库操作,大屏显示处理数据库后的数据,要求4个大屏不能影响.所以我想应该用到多线程.请高手们给个思路或建议.急!!!谢谢了.
       到这里才算看明白了些,你这问题涉及线程的同步以及线程的调度,主要看你怎么设计了,如果你有4个线程分别完成对四个4个大屏的数据读取和重绘操作,问题不大,主要是同步和线程调度,不要试图用timer来做,那种轮循方式很难达到你的要求。
      我不知道我理解的对不对,但我是这么想的,首先,你有四个辅助线程来完成数据提取和界面重绘的工作(例如重绘的工作使用临界区的方式来完成和VCL的同步),又或者是4个线程完成数据读取,但将重绘工作放到主线程中运行(也就你最开始说的问题,这种方式你还要多花点心思考虑线程的调度,除了4个辅助线程,你还要考虑到对界面重绘的主线程)。如果采用第一种方式,线程完成了数据提取和界面重绘工作,对界面重绘的操作可以用临界区的方式来完成,让系统来决定线程的调度就可以了。如果使用Synchronize来把重绘工作放到主线程完成,那么根据你线程的优先级以及重绘界面的代码,可以配合sleep(0)或者SwitchToThread来影响线程的调度已使得界面更新显得流畅。