Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите рабобраться в коде. Работа с COM портами 
:(
    Опции темы
AnomaliA
Дата 24.9.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



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

Код

 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
Модератор: используйте подсветку кода!

PM MAIL   Вверх
kami
Дата 24.9.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



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

Это сообщение отредактировал(а) kami - 24.9.2009, 17:29
PM MAIL WWW   Вверх
AnomaliA
Дата 24.9.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



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

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

Fopm1 := TForm1.Create (Application);

 


PM MAIL   Вверх
kami
Дата 24.9.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(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;

PM MAIL WWW   Вверх
AnomaliA
Дата 25.9.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



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


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

Это сообщение отредактировал(а) AnomaliA - 25.9.2009, 15:42
PM MAIL   Вверх
kami
Дата 25.9.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



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

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

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

Что я просил показать из кода.

Это сообщение отредактировал(а) kami - 25.9.2009, 12:23
PM MAIL WWW   Вверх
AnomaliA
Дата 25.9.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



Нашёл в чем ошибка, но от этого не легче. Всё упирается в метод Synchronize второго потока, который ждет ответа от ком порта, и насколько я почитал в интернете это нерешаемо.
PM MAIL   Вверх
kami
Дата 25.9.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



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

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

P.S.так как ты отказываешься отвечать на мои вопросы, давать дополнительную информацию, необходимую для решения проблемы, покидаю эту тему.
PM MAIL WWW   Вверх
AnomaliA
Дата 26.9.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.9.2009

Репутация: нет
Всего: нет



kami, прости если что не так, просто я действительно нашел в чем там проблема, и всё что я писал касаемо метода Create  тут оказалось непричем. А насколько я почитал касаемо Synchronize в DLL выхода нигде не нашёл, но если что подскажешь буду благодарен smile
PM MAIL   Вверх
СЭНСЭЙ
Дата 2.10.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



:()

Это сообщение отредактировал(а) СЭНСЭЙ - 2.10.2009, 19:39
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.