程序涉及到socket通讯,多线程,数据库,不少是接收到socket请求后,开个线程,然后在线程里处理数据库。现在在压力测试过程中,会出现界面突然消失的情况,打开任务管理器一看,进程也没了,而且没有任何错误提示,请问这种情况有可能是什么原因引起的?

解决方案 »

  1.   

    procedure RecvMainThread(p:pointer);stdcall;
    begin
      try
        try
          CoInitialize(nil);
          Ra_len := sizeof(Ra);
          RecvSocket:=accept(FormMain.MainServer, @ra, @ra_len );      //接收数据
          fdset := new(pfdset);
          fdset.fd_count := 1;
          fdset.fd_array[0] := RecvSocket;      //超时10秒
          timeout:=new(pTimeVal);
          timeout.tv_sec:=10;
          timeout.tv_usec:=0;
          select(RecvSocket, fdset, nil, nil, timeout);      //握手信号,接收
          RetLen := recv(RecvSocket, BlockBuf, 1024, 0);
          //收到数据
          if RetLen>0 then
          begin
            ...数据库操作(都是数据库操作函数,ADOConnection,ADOQuery动态生成,函数最后释放,有临界区)
          end;    except
          exit;
        end;
      finally
         if fdset<>nil then
           Dispose(fdset);     if timeout<>nil then
           Dispose(timeout);
          
         closesocket(RecvSocket);     CoUninitialize;
      end;
    end;
      

  2.   

    印象中没开stack检查的话,stack overflow有可能会让程序直接挂掉
      

  3.   

    什么叫开stack检查,怎么开开stack检查?
      

  4.   

    有没有调用DLL库什么的,如果有注意内存的管理,以及接口类型要保持一致,否则容易出现楼主那种情况。
      

  5.   

    多线程访问数据库时,每个线需要独立的ADOConnection,不能共用一个。
    你最好加个日志,记录每个时间段开了多少个线程,如果有可能最好记录数据库最大的并发连接数。
    这可能要综合分析一下。多线程的程序本身就不太好调试,稳定性比单线程差些。
    多线程最常见的问题是资源访问冲突。
      

  6.   

    我的数据库操作都封在函数里,都是函数里单独动态创建ADOConnection和ADOQuery,用try  finally结构释放
      

  7.   

    我调试时发现异常都是出现在AdoQuery.Open运行时,但是这种异常不会造成程序关闭
      

  8.   

    你是什么数据库,如果你能确认是open的问题,应该是并发导致的,你可以用临界区控制一下,不要让线程同时执行Open
      

  9.   

    菜单 project -> options -> Linker -> Memory Sizes -> Max Stack size -> $01000000 (原先为$00100000)然后试试。