Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Помогите рабобраться в коде. Работа с COM портами


Автор: AnomaliA 24.9.2009, 15:35
У меня тут вот какая проблема. Есть компонент для работы с ком портом в котором есть класс, читающий поток

Код

 TReadThread = class(TThread)
  private
   FOwner   : TComPort;
   FInBuffer: TArrayOfByte;{ Входной буфер }
   FErrCode : Cardinal;    { Сохраняет код ошибки }
   FCount   : Integer;     { Реально прочитанное число байт }
  protected
   procedure   Execute; override;
   procedure   DoReadPacket;
  public
   constructor Create(AOwner: TComPort);
   destructor  Destroy; override;
 end;

{------------------------------------------------------------------------------}
{ TReadThread::Constructor                                                     }
{------------------------------------------------------------------------------}
constructor TReadThread.Create(AOwner: TComPort);
begin
   { Создаём работающий поток }
   inherited Create(false);        // Нужно false
   FOwner:= AOwner;
   { Создаем новый буфер }
   SetLength(FInBuffer, FOwner.FInBufSize);
end;
{------------------------------------------------------------------------------}
{ TReadThread::Destructor                                                      }
{------------------------------------------------------------------------------}
destructor TReadThread.Destroy;
begin
   { Освобождаем буфер }
   SetLength(FInBuffer, 0);
   inherited Destroy;
end;
{------------------------------------------------------------------------------}
{ Вызывается для передачи события о приходе байта в основной компонент через   }
{ метод Synchronize                                                            }
{------------------------------------------------------------------------------}
procedure TReadThread.DoReadPacket;
begin
 with FOwner do begin
  if Assigned(FOnReadPacket) then
   FOnReadPacket(FInBuffer, FCount, FErrCode);
 end;
end;


Когда  этот компонент работает с приложением, то всё нормально, а когда я его добавляю в библиотеку то не вызывается метод Execute, который читает ответы COM Порта. Почему такое может быть? Конструктор класса вызывается.



M
THandle
Модератор: используйте подсветку кода!

Автор: kami 24.9.2009, 17:27
при добавлении сообщения есть очень полезная кнопочка "Код", которая упрощает чтение кода.
По сабжу - где в библиотеке вызывается конструктор потока?
То есть - 
1. отдельная функция для его создания
2. при инициализации библиотеки
3. etc...
Если п.2 - то срочно переделать в п.1 и будет счастье. Сам не так давно напоролся на эти грабли.

Автор: AnomaliA 24.9.2009, 19:48
Я не гуру в этом деле, поэтому если можно немного попроще  smile  
Как и где его нужно объявлять?

У меня было так, сам компонент я добавил на форму, которая была отдельным Юнитом, а форму создавал в теле библиотеки 
Код

Fopm1 := TForm1.Create (Application);

 


Автор: kami 24.9.2009, 22:43
Цитата(AnomaliA @  24.9.2009,  19:48 Найти цитируемый пост)
а форму создавал в теле библиотеки 

Мало информации. Где конкретно в теле библиотеки находится эта строка кода?

Я имею ввиду что-то типа (далее - курсивом то, как примерно должна была подаваться информация):
эта строка находится в процедуре:
Код

procedure myDLLFormCreate;
begin
  Fopm1 := TForm1.Create (Application);
 .....
end;

Эта процедура вызывается здесь, в коде инициализации длл
Код

library myDLL;
uses...
...........
procedure.....
begin
end;
............
begin
  myDLLFromCreate;
 .....
end. // это - окончательный end, всё после него игнорируется.


Если код так и выглядит, то срочно переделать на что-нибудь эдакое:
Код

library myDLL;
.........
procedure myDLLFormCreate;
begin
  Fopm1 := TForm1.Create (Application);
 .....
end;

export myDLLFormCreate;

И уже из основной программы после подключения библиотеки вызывать процедуру в dll
т.е.: (код основной программы)
Код

procedure myDLLFromCreate; external 'myDLL.dll';

procedure TMainForm.FromCreate(Sender:TObject);
begin
  myDLLFormCreate;
  ......
end;

Автор: AnomaliA 25.9.2009, 10:26
К сожелению это не сработало (((  Хотя может и я нетак выразился, вообщем вот примерно код компонента


В нем все функции которые работают когда подгружаешь форму с помошью Create, Но  вот процедура TReadThread.Execute нехочет принимать ответ от СОМ порта. В приложениях она выполняется, а вот в библиотеке почему-то нет ((( с чем это может быть связанно?

Автор: kami 25.9.2009, 12:23
код компонента здесь АБСОЛЮТНО ни при чем.
еще раз прочитай предыдущие сообщения - где я там говорил, что что-то криво с компонентом?
минимальный код dll в студию.
Цитата(AnomaliA @  25.9.2009,  10:26 Найти цитируемый пост)
В приложениях она выполняется, а вот в библиотеке почему-то нет ((( с чем это может быть связанно?

Потому что в dllMain при DLL_process_attach создание потоков невозможно. А у тебя, судя по всему, именно в ней и вызывается конструктор компонента.

Добавлено через 11 минут и 55 секунд
Цитата(AnomaliA @  25.9.2009,  10:26 Найти цитируемый пост)
К сожелению это не сработало (((

http://forum.vingrad.ru/index.php?showtopic=274096&view=findpost&p=1977079

Автор: AnomaliA 25.9.2009, 15:41
Нашёл в чем ошибка, но от этого не легче. Всё упирается в метод Synchronize второго потока, который ждет ответа от ком порта, и насколько я почитал в интернете это нерешаемо.

Автор: kami 25.9.2009, 18:22
Цитата(AnomaliA @  25.9.2009,  15:41 Найти цитируемый пост)
насколько я почитал в интернете это нерешаемо.

синхронизация двух дополнительных потоков делается не через Synchronize. И это решаемо.

P.S.так как ты отказываешься отвечать на мои вопросы, давать дополнительную информацию, необходимую для решения проблемы, покидаю эту тему.

Автор: AnomaliA 26.9.2009, 11:31
kami, прости если что не так, просто я действительно нашел в чем там проблема, и всё что я писал касаемо метода Create  тут оказалось непричем. А насколько я почитал касаемо Synchronize в DLL выхода нигде не нашёл, но если что подскажешь буду благодарен smile

Автор: СЭНСЭЙ 2.10.2009, 13:14
:()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)