线程A:
TA.Execute;
begin
  while(true) do
    Synchronize(TestA)
end;
TA.TestA
begin
  MainUnit.Demo1(); {此函数在主程序中,里面有好多代码,其中也调用主程序的其它函数,主程序的很多全局变量等等}end;线程B:
TB.Execute;
begin
  while(true) do
    Synchronize(TestB)
end;
TB.TestB
begin
  MainUnit.Demo2();  {此函数在主程序中,里面有好多代码,其中也调用主程序的其它函数,主程序的很多全局变量等等}end;demo1和demo2这两个函数里面的代码已经设计了避免同时修改某一全局变量。因为主程序有太多的东西无法传到线程中去,所以就如上那样做了。
请问这样设计会不会出问题?虽然不是很规范,但有没有犯了大忌?
请有经验的朋友指点一下,多谢!

解决方案 »

  1.   

    用Synchronize调用倒不会出什么问题.但效率很低,因为归根到底是在主线程中单线程执行被调用代码.
      

  2.   

    不会吧?demo1和demo2这两个函数不可能同时执行?
      

  3.   

    stubborndonkey()说的可能有道理,我刚才测试了一下,好像真的是这样。问题严重了!
      

  4.   

    stubborndonkey() 说地对,因为你使用了Synchronize所以Demo1t和demo2都将在主线程中执行, 所以你的代码是不合理的,尽管你有三个线程但是和一个线程的执行效率是一样的.
    不知道楼主在demo1和demo2中的代码是否用了VCL中的东西(因为VCL本身是线程不安全的),如果没有,那可以将Synchronize去掉,没必要都到主线程中执行. 如果有,那么,为了提高效率,重新设计DEmo函数,将不用VCL的部分搞出来放在附属线程中.
      

  5.   

    我把Synchronize去掉了,这样好像可以了。
    那个Synchronize在这个地方是画蛇添足呀。我没有用到vcl.
    去掉Synchronize的话,是否合理?
    为什么要调用主程序的函数呢?因为这些函数用到了主程序的很多变量。
    请大侠们多发表意见!
      

  6.   

    Synchronize过程的初衷是为了解决VCL类库中多线程访问的安全冲突,所以针对VCL来说用的较多。然而,如果用户编的代码可以使用互斥对象或信号量的方法解决临界区访问的问题来提高安全性,最重要的是效率。
      

  7.   

    出错倒不会,但在Synchronize里运行太多代码影响速度