Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2022, 16:19   #1
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию Класс и поток

Прошу помощи как начинающий.

Ниже выкладываю обобщенные фрагменты из программы.
Есть класс TCSyn и поток MyThread. В потоке выполняется процедура VaChar.
Скажу сразу программа компилируется без ошибок и выполняется. Но...
Но когда запускается поток в процедуре VaChar при выполнении Count:= Count+1; происходит ошибка и процесс останавливается. Похоже, что поток не видит переменных описанных в классе TCSyn. Прошу подсказать как исправить это и что делал не правильно.

Код:
TCSyn = class(TComponent)  //TComponent
  Public
   
    inp          : Tinp;          
    FString    : String;         Сообщение
    Count      : integer;
    Tek          : Double;        
    TimeTek   : Double;        

    Constructor Create(AOwner:TComponent);override;     
    Destructor  Destroy; override;                         
   

    procedure VaChar;
   
  Protected
 
  Private

 End;
-------------------------------------
 type
 MyThread=class(TThread)
 private{private declaration}
  
    pser:  TCSyn;

 protected
 procedure execute;override;
 public

 end;

 var MyThr: MyThread;
-------------------------------------------------------------------------
procedure MyThread.execute;
 var S: string; i:integer;
begin

             Synchronize(pser.VaChar);
 
end;
------------------------------------------------------------------------
procedure TCSyn.VaChar;
var S:String; 
begin


  Count:= Count+1;     


end;

Последний раз редактировалось BDA; 30.07.2022 в 18:18.
arktik вне форума Ответить с цитированием
Старый 30.07.2022, 18:26   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

1) При чем тут Synchronize. Вы же работаете с объектом в том же самом потоке, который создан локально для каждой его копии.
2) А конструктор и деструктор класса вы зачем перегружали. Может стоит сначала создать экземпляр:
Код:
pser := TCSyn.Create(nil);
а в конце его необходимо уничтожить
Код:
pser.Destroy;
Тогда и вызов сработает как надо.

ADD: Спасибо BDA, а то это полотенце еще и курсивом читать было лень.

Последний раз редактировалось macomics; 30.07.2022 в 18:31.
macomics вне форума Ответить с цитированием
Старый 30.07.2022, 18:58   #3
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
1) При чем тут Synchronize. Вы же работаете с объектом в том же самом потоке, который создан локально для каждой его копии.
2) А конструктор и деструктор класса вы зачем перегружали. Может стоит сначала создать экземпляр:
Код:
pser := TCSyn.Create(nil);
а в конце его необходимо уничтожить
Код:
pser.Destroy;
Тогда и вызов сработает как надо.

ADD: Спасибо BDA, а то это полотенце еще и курсивом читать было лень.
Вот я тоже пытался создать экземпляр, но не пойму где. В конструкторе потока или класса?
arktik вне форума Ответить с цитированием
Старый 30.07.2022, 19:04   #4
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию

Цитата:
Сообщение от arktik Посмотреть сообщение
Вот я тоже пытался создать экземпляр, но не пойму где. В конструкторе потока или класса?
Можно пример?
arktik вне форума Ответить с цитированием
Старый 30.07.2022, 19:06   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А где вы описали конструктор потока?
Но в конструкторе класса создавать экземпляр уже поздно.
macomics вне форума Ответить с цитированием
Старый 30.07.2022, 19:24   #6
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
А где вы описали конструктор потока?
Но в конструкторе класса создавать экземпляр уже поздно.
Нет у меня конструктора потока. Где его вызывать, если я его и опишу.
arktik вне форума Ответить с цитированием
Старый 30.07.2022, 20:43   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Конструктор потока у вас есть, но вы его не перегружаете. Но его и не нужно перегружать.
Достаточно используя execute вначале это процедуры инициализировать переменные, а в конце - уничтожить.
macomics вне форума Ответить с цитированием
Старый 30.07.2022, 21:17   #8
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Конструктор потока у вас есть, но вы его не перегружаете. Но его и не нужно перегружать.
Достаточно используя execute вначале это процедуры инициализировать переменные, а в конце - уничтожить.
Благодарю Вас! Попробую программу в понедельник ибо на работе она работает с железом.
Спасибо!
arktik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание классов - Имеется класс город. Класс область содержит массив городов. Класс область содержит метод, который осуществляет поиск города по его названию. martofpain C# (си шарп) 5 23.12.2019 07:57
Класс Complex.Извлечение и помещение в поток. Otar4ik Помощь студентам 2 19.11.2014 20:55
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Освободить поток. Нужно удалить 1 событие и 1 класс TwiX Общие вопросы Delphi 3 26.04.2010 02:23