Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2009, 20:33   #11
AnomaliA
Новичок
Джуниор
 
Регистрация: 27.09.2009
Сообщений: 7
По умолчанию

Как я понял при отправке сообщения в СОМ порт, основной поток ждет тайм-аут выполнчч постоянно Application.ProcessMessages, тоесть заставляет приложение прочитать очередь сообщений. Во втором потоке DoReadPacket делает вот что
Код:
procedure TReadThread.DoReadPacket;
begin
 with FOwner do begin
  if Assigned(FOnReadPacket) then
   FOnReadPacket(FInBuffer, FCount, FErrCode);
 end;
end;
в конструкторе главного обьекта
Код:
FOnReadPacket:= onGetPacket;
потом огромная процедура читает данные пакета ответа
Код:
procedure TIskraCP.onGetPacket(Packet: TArrayOfByte; Size: Integer; ErrCode: Cardinal);
var
   i: Integer;
   AT, AR, PID: BYTE;
   RClose: Boolean;

   byte1, byte2, byte3, byte4: Byte;
   car1, car2                : Cardinal;
   cur1, cur2                : Currency;
   int8                      : Int64;
   vstr1                     : AnsiString;
   vDate, vTime              : TDateTime;
   wrd1                      : WORD;
begin
   { Добавляем принятые данные в буфер }
   for i:= 0 to Size-1 do begin
      { Если превышен размер }
      if ((FTailMsg)>=SizeBuffer) then begin
         { Сбрасываем флаг принятого стоп-байта }
         FOnSB:= false;
         { Сбрасываем указатель хвоста сообщения }
         FTailMsg:= 0;
      end;

      { Если получили старт-байт }
      if Packet[i] = StartByte then begin
         { Устанавливаем флаг "Старт-байт принят" }
         FOnSB:= true;
         { Копируем его в буффер }
         RBuffer[0]:= StartByte;
         { Увеличиваем хвост }
         FTailMsg:= 1;
         Continue;
      end;

      { Если получили стоп-байт }
      if Packet[i] = StopByte then begin
         { Проверяем, был ли принят старт-байт }
         { ...если старт-байт принят небыл }
         if not FOnSB then begin
            { Сбрасываем хвост }
            FTailMsg:= 0;
            Continue;
         end
         { ...иначе, проверяем сообщение }
         else begin
            { Добавляем стоп-байт }
            RBuffer[FTailMsg]:= StopByte;
            { Тестируем сообщение. В зависимости от вида полученного пакета,   }
            { принимаем действия.                                              }

            case DetectRMsg(RBuffer) of
             { Сообщение ошибочно. }
             2: begin
                end;
             { Принят пакет-команда }
             1: begin
                end;
             { Принят пакет-ответ }
             0: begin
                   { Если ждём ответа, то копируем сообщение и выставляем }
                   { флаг получения                                       }
                      if RStatus = cp_Pass then begin
                      { Выделяем память }
                      SetLength(MsgBuff, FTailMsg+1);
                      { Копируем сообщение }
                      MsgBuff:= Copy(RBuffer, 0, FTailMsg+1);

   {++++++++++++++++++++++++++++++++++}
   { Копируем сообщение в свойство }
   SetLength(FRMsg, Length(MsgBuff));
   FRMsg:= COPY(MsgBuff, 0, Length(MsgBuff));
   {++++++++++++++++++++++++++++++++++}
   
                      { Выставляем флаг }
                      RStatus:= cp_Receipt;
                   end
                end;
            end;
            { Сбрасываем флаг принятого старт-байта }
            FOnSB:= false;
            { Сбрасываем хвост }
            FTailMsg:= 0;
            Continue;
         end;
      end;

      { Если уже был получен старт-байт, копируем данные в буфер }
      if FOnSB then begin
         { Копируем байт }
         RBuffer[FTailMsg]:= Packet[i];
         { Увеличиваем хвост }
         Inc(FTailMsg);
         Continue;
      end;
   end;
end;
вот как-то так. Дело ещё в том что от устройства могут приходить команды ещё и без запроса.
AnomaliA вне форума Ответить с цитированием
Старый 29.09.2009, 12:29   #12
sinedSpb
 
Регистрация: 14.08.2009
Сообщений: 8
По умолчанию

Предлагаю тебе попробовать следущее:
Вариант 1 : Посмотри будет ли это работать без synchronize
Вариант 2 : В код DPR файла проекта DLL , добавить строки
Нужно получить handle главного окна вызыващего exe - шника
например так
MainWindowHandle := FindWindow(null,'Имя окна');
или передать его в качестве параметра
Application.Handle := MainWindowHandle;
Это должно интегрировать DLL с главном окном приложения после этого возможно Synchronize будет корректно работать.
sinedSpb вне форума Ответить с цитированием
Старый 29.09.2009, 13:08   #13
AnomaliA
Новичок
Джуниор
 
Регистрация: 27.09.2009
Сообщений: 7
По умолчанию

Спасибо за помосч sinedSpb и http://forum.vingrad.ru/forum/topic-60076.html вроде работает с первым способом, просто поправил тайм-аут, но если будут ошибки придётся делать 2 способом.
AnomaliA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск Load.dll (бывшая Load.exe) в дереве проц-ов, Как запустить прогой на C# .dll-ку kapustin Общие вопросы .NET 10 23.09.2009 22:20
Метод Synchronize класса TThread EdNovice Общие вопросы Delphi 10 01.08.2009 14:47
dll Maxxx 83 Помощь студентам 5 01.02.2009 14:49
DLL michaellos Win Api 1 16.11.2007 21:03