Главная страница
    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.031 c
14-1118216502
Bronco
2005-06-08 11:41
2005.07.11
И снова об авто. Очередной шедевр отечественного автопрома


8-1110366964
besen-ok
2005-03-09 14:16
2005.07.11
На форме есть Canvas, из потока рисую в него


6-1112683463
doktor
2005-04-05 10:44
2005.07.11
как узнать все IP в локальной сети


14-1118214604
Ozone
2005-06-08 11:10
2005.07.11
Symantec GHost 7.5.0.335


1-1118552665
Serg777
2005-06-12 09:04
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский