Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.029 c
5-1089664919
boband
2004-07-13 00:41
2005.07.11
Как управлять прорисовкой кнопки?


3-1117191709
ArtSam
2005-05-27 15:01
2005.07.11
DCOM, Socket. Помогите: как их настроить для обеспечения работы


3-1117625052
Bagdat
2005-06-01 15:24
2005.07.11
Можно ли поток класса TStream сразу преоброзовать в Excel файл?


3-1117091783
mebel
2005-05-26 11:16
2005.07.11
Последний раз! покажите в тексте что я делаю не так?


14-1118008114
KilkennyCat
2005-06-06 01:48
2005.07.11
Может, напрасно сайт съехал с валуехоста?




   Наверх