关于c# 程序长时间运行问题。

sos  程序运行 5个小时后 刷新界面很卡,最小化还原后界面就黑了。
 任务管理器切tab也很卡。重启程序正常。
  5个小时内。 内存占用一直稳定在20M左右。 
 不过错误页面 每小时 1000w左右。 
 程序主要功能是  句柄截图识图找坐标 点击。
 某内存地址的值锁定(每秒修改成指定值)。

求解惑。

回答: 关于c# 程序长时间运行问题。

  1. 你把sleep调小并不是发现问题并解决问题的方法,完整的一个任务过程在额定计算性能的计算机上会有一个极限值,也就是讲至少需要多长时间才能处理完毕,仅能在他的处理能力范围内才可正常工作,反之,一个原本正常的程序,将sleep放小,马上异常就会出来,将任务交给一个能力有限的人在不可能完成任务的时间内去处理任务,结果可想而已,没有完成任务所暴露出的异常是真正的异常吗?完全不是。

程序长时间运行后的死机问题,急!!!

  1. Q
    此软件是用c++builder开发的,它的功能是连续的从串口读取数据,然后在屏幕上显示出来,并且把所有数据都存储在硬盘文件里。但是最近老出现死机问题,刚开始时是连续运行一周以后死机,现在是不定时死机,有时两三天,有时一天,重启就好了。运行一段时间后查看任务管理器,cpu,内存使用情况都很正常。请专家们帮忙分析一下原因,怎么解决???
    死机的现象就是定格,显示屏上的画面不动了,只能按主机上的reset才能重启。有时候死机重启后串口驱动程序会丢。
  2. A
    文件问题是要改善。
     还有软件里一共用了c++builder的20多个定时器,这个会有关系吗?

    多了,定时器多了有可能相互影响

程序长时间未操作,导致SQL Server连接自动断开,求解

  1. Q
    程序用BCB2010的ADO控件开发,调用Query和StoredProc
    现象是如果程序长时间未操作,大概半个或1个小时以上,再执行Query或StoredProc操作就无法连接数据库,重启程序就没问题。
    是哪里的timeout需要设置?求解
  2. A
    或者你可以添加一个额外的数据控件,用计时器控制,每隔20分钟取一次服务器时间,这样耗费资源极少,也不会引起冲突

线程池实现socket 通信问题,不能长时间运行.

  1. Q
    1.创建一个监听

    import java.io.IOException;
    import java.net.*;
    import java.util.concurrent.Future;
    
    public class Listener extends ServerSocket implements Runnable {
    
    	public Listener() throws IOException {
    		super(Server.AppConfig.getLocalhost().getListenport());
    	}
    
    	@Override
    	public void run() {
    		while (true) {
    			try {
    				Socket socket = accept();
    				CreateServer server = new CreateServer(socket, Server.pool);
    				Future<Integer> result = Server.pool.submit(server);				
    				Server.Results.add(result);
    			} catch (Exception e) {
    				Server.createMessage("Listener:"+e.getMessage());
    			} finally {
    			}
    		}
    
    	}
    }


    2. 创建一个解析socket的 服务

    import java.net.Socket;
    import java.util.Date;
    import java.util.Scanner;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.io.*;
    
    import com.szcust.einfo.receiveEntity.serverEntity.DataText;
    
    public class CreateServer implements  Callable<Integer> {
    	private Socket client;
    	private Scanner in;
    	private PrintWriter out;
    	private Resolve resolve;
    	private int timeOut = 30;
    	private Date lastTime;
    
    	public CreateServer(Socket s, ExecutorService pool) {
    		client = s;
    		lastTime = new Date();
    		resolve = new Resolve();
    		try {
    			client.setSoTimeout(30 * 60 * 1000);
    			Server.ClientCount = Server.ClientCount + 1;
    			in = new Scanner(client.getInputStream(), "GB2312");
    
    			// in = new BufferedReader(new
    			// InputStreamReader(client.getInputStream(), "GB2312"));
    			out = new PrintWriter(client.getOutputStream(), true);
    			out
    					.println("--- Welcome To Universtar Science & Technology Softwear System ---");
    
    		} catch (Exception ex) {
    			Server.createMessage("Ex " + ex.getMessage());
    		}
    	}
    
    	@Override
    	public Integer call() {
    		String line = "";
    		while ((line = in.next()) != null) {
    			try {
    				if (check(line)) {
    					DataText dataText = resolve.getDataTextBySoketString(line);
    					if (dataText != null) {
    						// Server.Data_Array.add(dataText);
    						resolve.saveDataRun(dataText);//业务代码
    					} else {
    						Server.createMessage("Resolve error " + line);
    					}
    				} else {
    					Server.createMessage("Check error " + line);
    				}
    
    			} catch (Exception ex) {
    				Server.createMessage("Ex " + ex.getMessage());
    				closeSocket(this.client	);
    			}
    		}
    		Server.ClientCount--;
    		return Server.ClientCount;
    	}


    3. 静态变量,用于保存各个线程之间的数据。

    import java.util.Calendar;
    import java.util.Vector;
    import java.util.concurrent.ConcurrentLinkedQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    import com.szcust.einfo.receiveBiz.FactorBiz;
    import com.szcust.einfo.receiveBiz.StationBiz;
    import com.szcust.einfo.receiveEntity.einfoEntity.Station;
    import com.szcust.einfo.receiveEntity.serverEntity.DataText;
    import com.szcust.einfo.receiveEntity.configEntity.Config;
    import com.szcust.einfo.receiveEntity.configEntity.ExLog;
    
    public class Server{
    
    
    	public static  ConcurrentLinkedQueue<DataText> Data_Array = null;
    	public static Vector<Station> Client_Stations = null;
    	public static Vector<Station> Server_Stations = null;
    	private static ConcurrentLinkedQueue<String> Message = null;
    	public static ConcurrentLinkedQueue<String> ErrorText = null;
    	public static ConcurrentLinkedQueue<Future<Integer>> Results = null;
    
    	public static ExecutorService pool = Executors.newCachedThreadPool();
    	public static Config AppConfig = null;
    	public static int ClientCount = 0;
    	public static boolean IsClear = true;
    
    	public static void  init() {
    		Data_Array =new ConcurrentLinkedQueue<DataText>();
    		Client_Stations = new Vector<Station>();
    		Server_Stations = new Vector<Station>();
    		Message = new ConcurrentLinkedQueue<String>();
    		ErrorText = new ConcurrentLinkedQueue<String>();
    		Results = new ConcurrentLinkedQueue<Future<Integer>>();
    		AppConfig = new Config();
    		ClientCount = 0;
    		IsClear = true;
    		loadData();
    	}

    问题补充:dwangel 写道Blocking Socket不适合用线程池处理通讯。
    单个线程会被挂起的。
    用NIO才合适。
    我这个是个长连接,还有心跳包不断的发上来。

    我对那个NIO 不是很熟,但是我试用到时候 好像有新的连接时要断开原有的连接,不能长连接。

    期待解决!!
    问题补充:dwangel 写道Blocking Socket不适合用线程池处理通讯。
    单个线程会被挂起的。
    用NIO才合适。
    我这个是个长连接,还有心跳包不断的发上来。

    我对那个NIO 不是很熟,但是我试用到时候 好像有新的连接时要断开原有的连接,不能长连接。

    期待解决!!yx200404 写道个人觉得没必要在accept后submit一个Callable

    直接execute一个Runnable

    同步好ClientCount就可以了吧

    我仔细检查并写日志调试了,上面的好像没有问题。但是问题归于:

    package com.szcust.einfo.receive;
    
    import java.util.ArrayList;
    
    import com.szcust.einfo.receiveBiz.BaseDataBiz;
    import com.szcust.einfo.receiveEntity.serverEntity.BaseData;
    
    public class DataSave extends Thread {
    	private Resolve resolve;
    	private BaseDataBiz baseDataBiz;
    
    	public DataSave() {
    		resolve = new Resolve();
    		baseDataBiz = new BaseDataBiz();
    	}
    
    	@Override
    
    	public void run() {
    		while (true) {
    			try {
    				if (dataArrayCheck(Server.Data_Array)) {
    					resolve.saveDataRun(Server.Data_Array.poll());
    				} else {
    					this.setPriority(MAX_PRIORITY);
    					Thread.sleep(10 * 1000);
    				}
    			} catch (Exception ex) {
    				Server.createMessage("DataSave: " + ex.getMessage());
    			}
    		}
    	}


    一直打印空错误:DataSave:null
    问题补充:dwangel 写道你的项目可以用外部库吗?

    你可以看看Netty这个NIO库。(或者apache mina,netty是mina的创始者写的,我用起来蛮方便的。)

    NIO是基于SELECT模型的。就是注册一批关注对象socketChannel,
    然后重复调用Select方法,当SocketChannel处于指定状态,比如 有数据,可写
    等状态,再拿出来处理。
    这样,可以分成主线程持续select,select出来需要处理的socketchannel放到一个队列,由threadpool里分线程取出来 处理。

    因为socketchannel操作不会阻塞,所以可以充分利用多线程。

    而你的代码用的是普通socket,普通socket的特性就是在read时,如果没有数据,则会阻塞住。而如果想利用线程池,应当是read没有数据时,继续往下走,把当前线程资源还回线程池。

    我开始用了 那个mina 但是我发现我的连接有很多,他开了很多线程。但是我不知道怎么及时的结束这些线程。

    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;
    
    import org.apache.mina.common.DefaultIoFilterChainBuilder;
    import org.apache.mina.common.IoAcceptor;
    import org.apache.mina.common.IoAcceptorConfig;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.transport.socket.nio.SocketAcceptor;
    import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
    
    public class Service implements Runnable {
    
    	private IoAcceptor acceptor;
    	private IoAcceptorConfig config;
    
    	public Service() {
    		acceptor = new SocketAcceptor();
    		config = new SocketAcceptorConfig();
    		DefaultIoFilterChainBuilder chain = config.getFilterChain();
    		// 使用字符串编码
    		chain.addLast("codec", new ProtocolCodecFilter(
    				new TextLineCodecFactory(Charset.forName( "UTF-8" ))));
    
    	}
    
    	public void run() {
    		try{
    		acceptor.bind(new InetSocketAddress(Server.AppConfig.getLocalhost()
    				.getListenport()), new MinaHandler(), config);
    		}catch (Exception e) {
    			Server.createMessage("Server Ex: "+e.getMessage());
    		}
    	}
    
    }
    
    
    
    import org.apache.mina.common.IoHandlerAdapter;
    import org.apache.mina.common.IoSession;
    
    import com.szcust.einfo.receiveEntity.serverEntity.DataText;
    
    
    public class MinaHandler  extends IoHandlerAdapter {
    	/**
    	 * 当有异常发生时触发
    	 */
    	public void exceptionCaught(IoSession ssn, Throwable cause) {
    		//cause.printStackTrace();
    		Server.createMessage("Handler Ex : " + cause.getMessage());
    		ssn.getCloseFuture().getSession().close();
    		ssn.close();
    	}
    
    	/**
    	 * 有新连接时触发
    	 */
    	@Override
    	public void sessionOpened(IoSession ssn) throws Exception {
    		ssn.write("--- Welcome To Universtar Science & Technology Softwear System ---");
    		//System.out.println("session open for " + ssn.getRemoteAddress());
    	}
    
    	/**
    	 * 连接被关闭时触发
    	 */
    	@Override
    	public void sessionClosed(IoSession ssn) throws Exception {
    		ssn.close();
    		//System.out.println("session closed from " + ssn.getRemoteAddress());		
    	}
    
    	/**
    	 * 收到来自客户端的消息
    	 */
    	public void messageReceived(IoSession ssn, Object msg) throws Exception {
    		//String ip = ssn.getRemoteAddress().toString();		
    		//ssn.write("Hello " + msg);
    		Resolve resolve = new Resolve();
    		DataText dataText = resolve.getDataTextBySoketString(msg.toString());
    		if (dataText != null) {
    			// Server.Data_Array.add(dataText);
    			resolve.saveDataRun(dataText);
    		} else {
    			Server.createMessage("Resolve error : " + msg);
    		}
    	}
    }
    
    


    问题补充:我对这个方面是第一次接触,期待解决。
    问题补充:dwangel 写道不用你主动结束那些线程,那些线程被应该会被设为 daemon=true,即主线程结束时自动结束。平时,等待 主监听线程传需要处理的任务进来,如果没有,则自己wait。

    那些就是线程池里的线程。

    我的是长连接,现在是每读取一行字符串,他都生成一个线程。
  2. A
    哦,我不是很清楚 MINA的实现,Netty里,是用线程池模型的,可以控制生成线程的上限。

    Mina里如果找不到控制线程数的地方,我建议还是用Netty吧。
    至少Netty算是公司在维护 线程池实现socket 通信问题,不能长时间运行.

线程中调用DLL,长时间运行出先问题。

  1. Q
    平台:Windows 7 + Delphi 7
    现象:主程序创建N个线程(>50),每个线程都会调用同一个DLL,线程内部为循环运行(除非Teiminate),大约1,2小时后开始报错。


    主程序相关代码(仅示例代码,主程序及DLL均第一个单元引用FASTMM):

    TCreateOrder = function(DeviceID:PChar): PChar; stdcall;


    procedure 
    var

      Func: TCreateOrder;
      t_dll:Cardinal;
    begin

      @Func := GetProcAddress(t_dll, 'CreateOrder');       //t_dll为exe建立时Load,,尝试过每次Load,问题依旧
      cmdSend    :=  Func(PChar(tcomid));                  
      //这里即为出错位置。Access violation at address 0C708563 in module 'ys.dll'. Write of address 00000000 In TThreadCJ
    end; 


    DLL代码:

    function CreateOrder(DeviceID:PChar): PChar;stdcall;
    var
      order:array[0..6] of integer;
      i:integer;
      orderstring:string;
      CommID:integer;
    begin
      try
        CommID := strtoint(DeviceID);
        order[0]:= CommID mod 200;
        order[1]:= commid div 200;
        order[2]:= 3;
        order[3]:= 0;
        order[4]:= 0;
        order[5]:= 0;
        order[6]:= 0;
        orderstring := '';
        for i:= 0 to 6 do
        begin
          orderstring := orderstring + inttohex(order[i],2) + ' ';
        end;
        Result := PChar(orderstring);
      except on e:exception do
        begin
            //
        end;
      end;
    end;

    exports
        CreateOrder;
  2. A
    orderstring离开函数已经被销毁,你还返回PChar(orderstring)。这个是个隐患。 

    楼主一直不重视这个! 呵呵。 

无线猫在室温为36度的环境下长时间运行有问题吗?

  1. Q
    目前都没出什么问题,我怕烧了
    所以来问问大家
  2. A
    硬件质量好的50+都没有问题,不过温度高的话影响寿命,而且也容易出现掉线

访问共享的文件时,如果对方没开机,需要很长时间才失败,怎么快速判断是否可以访问?

  1. Q
    程序很简单,需要把图像保存到远程机器的共享里,我的代码是这样写的:

    CString netpath = _T("\\\\192.168.40.53\\WallPapers\\" + m_name + ".bmp");
    Status sta = img->Save(netpath, &bmpClsid);
    //通过sta判断是否保存成功

    当40.53这台机器连接正常的时候运行没问题,但是如果这台机器关机了,程序运行到这就会卡住,完全失去响应,而且需要等很长时间函数才返回,继续执行判断的部分,不知道怎样才能快速的得知共享文件是否能访问,或者如何自己设置一个短些的超时时间,防止程序长时间的失去响应,我试了用PathFileExists函数,也是一样慢,感觉原理是一样的,都是让系统去访问,但系统的这个超时时间太长了
  2. A
    也可以换个思路,开一个线程去img->Save(netpath, &bmpClsid);
    然后主线程设置个计时器,三秒后还没有保存成功,主线程则认定为保存失败,作失败处理。
    新开的线程img->Save(netpath, &bmpClsid);阻塞到一定时间后自行结束。

我装PWS运行APS时,文本框输入后,为何要等很长时间?而以前都不要等时间.

  1. Q
    我装PWS运行APS时,文本框输入后,为何要等很长时间?而以前都不要等时间.
  2. A
    这个问题是ie的毛病,你在ie的internet选项里点击内容选项,再点击清除内容及清除密码按钮后,这个问题就解决了。

SMGP程序 与电信网关连接 是不是的会出现连接断开,因为我们有个重连机制,可能需要过10分钟,或者时间更长1天或者更长时间才能连接上网关,请高手赐教!!!

  1. Q
    SMGP程序 与电信网关连接 是不是的会出现连接断开,因为我们有个重连机制,可能需要过10分钟,或者时间更长1天或者更长时间才能连接上网关,请高手赐教!!!

    但是SMGP程序是采用长连接的,如果信道上(连接)没有数据,获发送链路包(心跳包)来维持连接,

    我自己下了个模拟器测试一直都不会出现这种问题,但是在真是环境下电信网关那 就会出现这种问题,但是网关能支持几百个客户端的连接,网速缓慢因素也不可能(我们传输的数据并不是很大,对于电信网关来说足以)

    我自己现在采用了两种模式:多进程时候 我开启多个SMGP程序去连接电信网关 这时只开启一对收发线程 也没问题的,(我自己在模拟环境下测试OK的。)

    当采用多线程连接时候 采用并发 也没问题, 我这个程序有个隔3秒就重连,但是程序一直重连失败 不知道啥问题,想请教各位?  我自己认为是网关关闭了连接,但是我每次在调用socket后都会关闭的啊  郁闷死了,!!!而且每次recv时候我都会设置超时操作!!

    请看错误代码:[20111125001557] smgp_socket_select_recv() recv error=[104][Connection reset by peer], iRet = [-1]!
    smgp_select_recv():recv failed!Len=-1
    Recvthread:1 SmgpRecvMsg() Error Head recvlen [-1][12]
    [20111125001557]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125001557]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125001909]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125001909]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125002221]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125002221]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125002533]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125002533]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125002845]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125002845]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003157]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003157]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003203]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003203]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003515]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003515]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003603]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003603]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003606]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003606]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003918]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003918]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003921]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003921]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003924]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003924]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003927]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003927]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003930]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003930]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125003936]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
    [20111125003936]Recvthread:1 SmgpRecvMsg() thread ReConnectSMG() fail!
    [20111125004000]Recvthread:1 SmgpRecvMsg() thread smgp_socket_close()!
    ConnectSMG():connect socket failed!
  2. A
    sleep(3)不是三秒,而且,smgp是采用的socket通信,不想cmpp协议采用的心跳来维持长连接,smgp是短连接,所有你建的重练机制完全可以在socket连接失败出现异常时在连接,不需要sleep来做,还有最好在两个socket直接使用单线程!

数据成功提交给数据库了 但页面却提示: 超过了脚本运行的最长时间

  1. Q


    错误类型:
    Active Server Pages, ASP 0113 (0x80004005)
    超过了脚本运行的最长时间。可以为 Server.ScriptTimeOut 属性指定新值或更改 IIS 管理工具中的相应值来更改此限制。
    /2014/43-rong-cn/reg2.asp


    浏览器类型:
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 2.0.50727) 

    网页:
    POST 201 ??? /2014/43-rong/reg2.asp

    POST Data:
    webname=w223&password=w223w223&password1=w223w223&[email protected]&membername=%B6%FE%B6%F8%C8%FD&gender=1&leixing=1&sheng=4&shi=&address=&zip=&hangye=0&persontel=&mobile=&yz=1525&Submit=%C8%B7%C8%C . . . 



    实在找不出究竟是哪里出错了
  2. A
    看看你的数据库字段和你页面写的字段是否一致或者因为前面销毁了conn对象,后面rs没打开
    又用了on error resume next.结果,永远也不会到rs.EOF,输出了无数表格直到脚本超时