Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 164

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Возникла необходимость второй раз использовать динамический массив потоков. Класс был создан ранее на основе TList. Все работает отлично. Просто поменял содержимое Execute у шаблона для потока и все. Но попытался на будущее создать визуальный компонент с набором свойств и событий. Столкнулся с проблемой: как код пользователя прописанный в событии (и работающий с глобальными переменными) запускать циклически в потоке?

Приложение:
  1. implementation
  2.  
  3. uses
  4. NsThreadList;
  5.  
  6. procedure TNsThread.Execute;
  7. begin
  8. while True do
  9. begin
  10.  
  11. if Terminated Then Terminate;
  12. end;
  13. end;


Примечание #1 (6 декабря 2008, 13:50):
В приложении не Terminate, а Exit. Извиняюсь.

Nasgool Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Nasgool (статус: 2-ой класс)
Вопрос отправлен: 6 декабря 2008, 13:43
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 7 декабря 2008, 12:11; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 6 декабря 2008, 18:25 [#1]:

Плохое это дело - связывать потоки и VCL часть. Вначале кажеться все просто, но потом начитают лезть проблемы - надо очень аккуратно всё синхронизировать. Почему - это тема долгого разговора, просто поверьте. Если хочеться разобраться - читайте Рихтера (автор такой, но там уровень высокий).
Поэтому лучше создать класс-массив (с надёжной синхронизацией) или использововать готовый - TThreadList.
Заменять метод Execute тоже не обязательно - никто не мешает его сделать абстрактным и наследоваться от него.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 7 декабря 2008, 01:19 [#2]:

if Terminated Then Terminate;

Упал со стула при виде этого.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 7 декабря 2008, 10:12 [#3]:

Вполне цивильный код. вот только если расшифровать его, то будет так
if Terminated Then Terminate:= true;
То есть , совершенно не то, что ожидал пишущий.
А теперь намёк на правильный код
if Terminated Then 
begin
  //некие действия для завершения
  //например освобождение ресурсов
 // можно в отдельную процедуру
 Exit;
end;
Галочка "подтверждения прочтения" - вселенское зло.
Nasgool

Nasgool (статус: 2-ой класс), 7 декабря 2008, 12:11 [#4]:

комментарий был написан через минуту после вопроса :)))

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.04 сек.