Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.04 c
1-1119612741
stud
2005-06-24 15:32
2005.07.11
подскажите где ошибка в коде?


9-1104148626
Zak
2004-12-27 14:57
2005.07.11
А не устраивать ли нам небольшие конкурсы по кодингу? (ч.3)


5-1089896672
Domkrat
2004-07-15 17:04
2005.07.11
PReport


9-1112006972
craKer
2005-03-28 14:49
2005.07.11
Наложение текстуры тайлами (GLscene)


1-1118440727
KOLIG
2005-06-11 01:58
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский