Главная страница
    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.45 MB
Время: 0.051 c
3-1117428662
yk
2005-05-30 08:51
2005.07.11
Как выбрать из DataSet то что мне нужно


3-1117090817
Vita-mebel
2005-05-26 11:00
2005.07.11
Все равно не работает поиск в BD


9-1112675007
Xeno
2005-04-05 08:23
2005.07.11
Полноэкранный режим


6-1112684047
frEE)stylEr
2005-04-05 10:54
2005.07.11
подключение удалённого доступа


3-1116699889
parasolka
2005-05-21 22:24
2005.07.11
Редактирование таблиц





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский