手头上有一产品,其中有几个功能是多线程,通过TThread来完成。多线程相关功能,会偶尔(概率很小)有指针错误、句柄错误等异常问题,因为没有找到确切出错的地方,我已经在程序很多地方加上了try...except等异常抛出的处理,尤其对一些free操作,比如tstringlist变量的free。不过好像功效不大。仍然会有相似问题产生。请各位有相关经验的朋友谈谈你们对多线程程序调试的经验,可能对我有启发,非常急切的等待您的回复!谢谢!

解决方案 »

  1.   

    只要线程间的同步、互斥做好了,没什么大问题。
    对全局变量、线程共用变量的使用要多加小心,可能需要用临界区来互斥。
    对 VCL 组件的操作要注意,它们不是线程安全的。
    先释放线程,再释放线程用到的全局变量、共享变量。
    线程不可滥用。
      

  2.   

    同意2楼意见,我也觉得是你同步问题没做好,不光是在Free时会调用指针和句柄,其实你的程序在运行时都是靠指针和句柄工作的。
      

  3.   

    那现在我需要在短时间内调试出一个较稳定的程序,不能大动程序结构和源码了。请问,如何使用一些“曲线救国”的方法,比如加try...except等方法来保证程序的稳定?
      

  4.   

    比如加try...except等方法来保证程序的稳定?
    -----
      这种方法在普通程序中是可以的,但多线程就.....
    不确定因素太多
      

  5.   

    线程中少使用全局变量、线程共用变量。使用时用重要区段保护,阻塞后用try...finally保证释放。对vcl控件操作时也用可用重要区段保护。调试的话,用下断点监视变量的作用不大,我都是用codesite记录变量和运行过程,不过消息的前后顺序好像也不是很准确。
      

  6.   

    重要区段,临界区,互斥变量。也搞不清楚谁是谁。
    我的意思就是定义一个
    TCriticalSection的全局实例;
    然后
    TCriticalSection.Acquire();
    try
     dosomething
    finally
     TCriticalSection.releas
    end;