Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Функция в потоке работает неверно. Помогите разобратся.   Найти похожие ветки 

 
Kolan ©   (2005-06-13 01:07) [0]

Здравствуйте,
 Продолжаю делать проект, разговор в котором шел в
http://delphimaster.net/view/1-1118492660/

Сделал просто модули и всё, некаких dll. (Потом добью).

Проблема вот в чём:

Есть необходимость проводить измерения в отдельном потоке.

Для этого написал класс поток.
 TMeasurmentThread = class(TThread)
 private
 protected
 public
   FMeasurmentDataRec: PMeasurmentData;
   constructor Create(CreateSuspended: Boolean;
     MeasurmentDataRec: PMeasurmentData);
   procedure Execute; override;
   procedure MakeMeasurment;
 end;


...

procedure TMeasurmentThread.Execute;
begin
 inherited;
 FreeOnTerminate := True;
 MakeMeasurment;
end;


...

procedure TMeasurmentThread.MakeMeasurment;
var
...
begin
 ...
 SwitchRelay(DeviceDataRec.CurrentRNumber);
...
end;


Процедура SwitchRelay находится в другом модуле, который через ещё один записывает данные в порт.

Вот её кусок:
function SwitchRelay(RelayNumber: Byte): Boolean;
var
...
begin
 if (RelayNumber <= 9)  then {2}
 // DONE: RelayNumber < ?.
 begin
 WriteByte($f1);{1}
...


В начале измерений параметр RelayNumber передаётся равным 0.

И что я вижу, дойдя до строки {1} дальше ничего не идет, а возвращается на {2}. Причем уже равен 1...

Я думаю что это из за того что для записи в порт используется компонент лежащий на главной форме. Я просто как бы обернул его:
 
function WriteByte(B: Byte): Boolean;
begin
 MainForm.Comm.WriteByte(B);
 Result := True;
end;


Подскажите в чём конкретно ощибка? И как испровить.

PS Без потока всё нормально работает...


 
Alexander Panov ©   (2005-06-13 02:04) [1]

Kolan ©   (13.06.05 1:07)
Я думаю что это из за того что для записи в порт используется компонент лежащий на главной форме


Этот объект используется только в этом потоке? Данные измегяются только в этом потоке?
Если, объект используется в разных потоках, то обязательно используй синхронизацию.
(Мне почему-то кажется, что основной поток у тебя тоже интенсивно использует MainForm.Comm).

Кроме того, используй try..except..end для обработки и гашения exception.



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.06 c
3-1117188400
Ander
2005-05-27 14:06
2005.07.11
Тип Float при создании таблицы.


14-1118152509
Valera
2005-06-07 17:55
2005.07.11
карта


1-1119421536
sergg
2005-06-22 10:25
2005.07.11
Импорт из Word и Excel


5-1086668430
Gelios
2004-06-08 08:20
2005.07.11
Редактор свойств/компонент а-ла Fields Editor


14-1118227771
DmitMal
2005-06-08 14:49
2005.07.11
Delhi 6 и Delphi 2005