Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вспомогательный поток

8.3K
05 июля 2007 года
Waldgeist
51 / / 18.10.2006
Доброго времени суток! Возникла такая проблема-вспомогательный поток в приложении иногда прекращает работу при этом не генерируется никаких исключений, флаг для выхода из потока точно не выставляется. В чем может быть проблема?
Код:
procedure DataCommThread.Execute;
var
  counter,PacketCount,fPos,fSize,ReadRes:integer;
  CheckSum,Temp:byte;
  BufferToFile,BufferFromFile:array[0..31] of byte;
begin
  { Place thread code here }
  hCOMPort:=Windows.CreateFile(PChar(COMPortName),GENERIC_READ or GENERIC_WRITE,0,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if GetCommState(hCOMPort,DCB)then begin
      ///////////////////////////////////////////////////////
      DCB.BaudRate:=CBR_115200;
      DCB.Parity:=NOPARITY;
      DCB.ByteSize:=8;
      DCB.StopBits:=ONESTOPBIT;


      TimeOuts.ReadIntervalTimeout:=0;
      TimeOuts.ReadTotalTimeoutMultiplier:=0;
      TimeOuts.ReadTotalTimeoutConstant:=0;
      TimeOuts.WriteTotalTimeoutMultiplier:=0;
      TimeOuts.WriteTotalTimeoutConstant:=0;

      SetCommState(hCOMPort,DCB);
      PurgeComm(hCOMPort,purge_txclear or purge_rxclear);
      EscapeCommFunction(hCOMPort,SETDTR);
      /////////////////////////////////////////
      while not CloseCOMPort do begin
          ////////////////////////

          if OutFileName<>'' then begin
              FillChar(BufferFromFile,32,0);
              BlockRead(outFile,BufferFromFile,32,ReadRes);
              FillChar(OutBuffer,38,0);

              if ReadRes>0 then begin
                 for counter:=0 to ReadRes-1 do begin
                    OutBuffer[counter+3]:= BufferFromFile[counter];
                 end;
                 OutBuffer[2]:=ReadRes+3;
                 OutBuffer[1]:=2;
              end
              else begin
                  OutBuffer[1]:=4;
                  CloseFile(outFile);
              end;
          end;
          ////////////////////////
          if SentFileName<>'' then begin
             OutFileName:=SentFileName;
             AssignFile(outFile,FullOutFileName);
             Reset(outFile,1);
             SentFileName:=''
          end;
          ////////////////////////
          OutBuffer[0]:=$7E;
          OutBuffer[37]:=$7E;
          //////////////////////
          OutBuffer[36]:=0;
          for counter:=1 to 35 do begin
            OutBuffer[36]:=byte(OutBuffer[36]+OutBuffer[counter]);
          end;
          ////////////////////////////////////////////////////
          EscapeCommFunction(hCOMPort,SETRTS);
          Windows.WriteFile(hCOMPort,OutBuffer,38,Count,@Ovr);
          Sleep(200);
          ////////////////////////
          EscapeCommFunction(hCOMPort,CLRRTS);
          Stat:=@TStat;
          Sleep(200);
          ClearCommError(hCOMPort,ComError,Stat);
          if Stat.cbInQue=38 then begin
              Windows.ReadFile(hCOMPort,InBuffer,38,readBytes,@Ovr);


              if (InBuffer[0]=$7E)and(InBuffer[37]=$7E) then begin
                 CheckSum:=0;
                 for counter:=1 to 35 do begin
                    CheckSum:=byte(CheckSum+InBuffer[counter]);
                 end;
                 if CheckSum = InBuffer[36] then begin

                    //////////////////
                    case InBuffer[1] of
                    1:
                      begin
                         for counter:=4 to InBuffer[2]do begin
                            InFileName:=InFileName+Char(InBuffer[counter]);
                         end;
                         ReadNextPacket:=True;
                         FullInFileName:=ExtractFilePath(Application.ExeName)+InFileName;
                         AssignFile(inFile,FullInFileName);
                         Rewrite(inFile,1);
                      end;
                    2:
                      begin
                          FillChar(BufferToFile,32,0);
                          for counter:=3 to inBuffer[2] do begin
                             BufferToFile[counter-3]:=InBuffer[counter];
                          end;
                          BlockWrite(inFile,BufferToFile,InBuffer[2]-3);
                      end;
                    3:
                      begin

                      end;
                    4:
                      begin
                          InFileName:='';
                          CloseFile(inFile);
                      end;
                    end;
                    //////////////////
                    if (OutBuffer[1]=1)or(OutBuffer[1]=2) then begin
                        ReadNextPacket:=True;
                    end;
                    OutBuffer[35]:=1;

                 end
                 else begin
                    OutBuffer[35]:=0;
                 end;
              end;
          end;
      end;
      /////////////////////////////////////////

  end;
  CloseHandle(hCOMPort);
end;
303
06 июля 2007 года
makbeth
1.0K / / 25.11.2004
Помести код метода в блок try..except..end и посмотри какое исключение генерируется.
16K
13 июля 2007 года
medved_68
36 / / 06.07.2006
Хм...ты открываешь СОМ порт в блокирующем режиме но в процедурах работы с СОМ почему то используешь Оверлап-Структуру:
 
Код:
Windows.WriteFile(hCOMPort,OutBuffer,38,Count,@Ovr);
И где объявление в потоке этой структуры??? Создание ее Евента??? :)
8.3K
17 июля 2007 года
Waldgeist
51 / / 18.10.2006
В главной форме
16K
20 июля 2007 года
medved_68
36 / / 06.07.2006
Цитата: Waldgeist
В главной форме


В таком случае зачем порт открываешь в блокирующем режиме???

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог