首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

帮忙分析一个网络通讯线程代码(在xp下运行正常、win7-32位运行2-3天就会报错)

2013-01-22 
帮忙分析一个网络通讯线程代码(在xp上运行正常、win7-32位运行2-3天就会报错)本帖最后由 yct0605 于 2012-0

帮忙分析一个网络通讯线程代码(在xp上运行正常、win7-32位运行2-3天就会报错)
本帖最后由 yct0605 于 2012-09-25 13:05:11 编辑 大概有10个左右的显示数据需要循环发送,每次发送创建线程,如果发送失败,释放失败的线程,以前的代码在xp上运行正常,最近一个现场使用的是win7-32位系统,程序运行2-3天就会报错,大家帮忙分析以下原因,多谢了:


  //发送线程
  type TSendThread = Class(TThread)
   private
     pingN,pingX,pingMkType:byte;
     pingW,pingH:word ;      
     function SendData(pPN:byte;pW,pH:integer; Px,pMkType:byte): byte;
   protected
     procedure Execute; override;
   public
     constructor Create(pPN,piW,piH:word; piX,piMKT:byte);

{---TSendThread------}

constructor TSendThread.Create(pPN,piW,piH:word; piX,piMKT:byte);
begin
  pingN:=pPN;
  pingW:=piW;
  pingH:=piH;
  pingX:=piX;
  pingMkType:=piMKT;
  inherited Create(False);
end;

procedure TSendThread.EXecute;
var
  tem:byte;
begin
  tem:=1;
   case pingN of
     1..6: tem:=SDB(pingN, pingW, pingH, pingX, pingMkType);
   end;
   ReturnValue:=tem;
end;

function TSendThread.SDB(pPN:byte;pW,pH:integer; Px,pMkType:byte): byte;
var
  GInitData : TWSADATA;
begin
  try
    WSAStartup($101, GInitData);
    Application.ProcessMessages;
    try
      case pPN of
        1..6:begin
                //获取发送数据
              end;
      end;

      if STCPIPDB(发送数据判断)=0 then
        result:=1
      else
        result:=2;

    finally
      WSACleanup;
    end;
  except
     result:=0;
  end;
end;


  //应用
  for i:=1 to 6 do
  begin
  SendThread[i]:=TSendThread.Create(i,pwh[pw[i]],pwh[ph[i]],pstype,pimk); //创建线程

          try
            if WaitForSingleObject(SendThread[i].Handle,LEDConnTimeOut)=Wait_Object_0 then
            begin
              tem:=SendThread[i].ReturnValue;
              //显示发送状态            
            end
            else
            begin
              SendThread[i].Terminate;
              //显示发送状态 


            end;
    end;


[解决办法]
只有10个数据,不用那么多线程吧.用异步socket就可以,论坛上有WinSock例子源码,可以参考一下.
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
procedure TMyTCPBase.InitSocket;
var
  iSet, err: integer;
  ss: string;
  Evt: WSAEVENT;
  Block: integer;
  saddrin: TSockAddr;
begin
  if FSocketType = stClientLink then
  begin  
    Lock;
    try
      FSktEvt.SockID := FSocket;
      Evt := WSACreateEvent();
      FSktEvt.FEventId := Evt;
    finally
      Unlock;
    end;
    SetAsyncEvt();         
  end //end of stClientLink
  else
  if FSocket = INVALID_SOCKET then
  begin
    try
      Lock;
      try
        FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
        if FSocket = INVALID_SOCKET then
        begin
          err := wsagetlasterror;
          ss := 'Create socket error, error code:' + inttostr(err);
          DoError(self, seSetting, PChar(ss), err);
          Exit;
        end;
      finally
        Unlock;
      end;

           FBindResult := DoBindAddr();
            Lock;
      try
        FSktEvt.SockID := FSocket;
        Evt := WSACreateEvent();
        FSktEvt.FEventId := Evt;
      finally
        Unlock;
      end;                      

            if FSocketType = stClient then 
      begin
        if not SetAsyncSel then //设置成异步选择模式
          Exit;
      end
      else
      if FSocketType = stServer then 
      begin
        if not SetAsyncEvt then


          Exit;
      end;
              
      iSet := 1;
      err := setsockopt(FSocket, IPPROTO_TCP, TCP_NODELAY, PChar(@iSet), SizeOf(iSet));
      if Err = Socket_Error then
      begin
        err := WSAGetLastError;
        ss := 'Set TCP_NODELAY error:' + IntToStr(err);
        DoError(self, seSetting, PChar(ss), err);
        Exit;
      end;
                
    except
      on E: Exception do
      begin
        err := WSAGetLastError;
        ss := 'Create socket abnormal:' + inttostr(err) + ',' + E.message;
        DoError(self, seAbnormal, PChar(ss), err);
      end;
    end;
  end; //end of if Fsocket = Invalid_socket

end;帮忙分析一个网络通讯线程代码(在xp下运行正常、win7-32位运行2-3天就会报错)
[解决办法]
做个运行日志来分析
[解决办法]
用静态线程
[解决办法]
报的错是什么错呢,这样的问题,一般是很难回答的。
[解决办法]
你这不是构成了多线程吗,使用临界区试试
另外,如果是比较频繁的创建线程,不如只创建一次
[解决办法]
try catch 抓错呗。
找到原因,再研究。

热点排行