|
Вопрос # 2 164/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Возникла необходимость второй раз использовать динамический массив потоков. Класс был создан ранее на основе TList. Все работает отлично. Просто поменял содержимое Execute у шаблона для потока и все. Но попытался на будущее создать визуальный компонент с набором свойств и событий. Столкнулся с проблемой: как код пользователя прописанный в событии (и работающий с глобальными переменными) запускать циклически в потоке?
Приложение: Переключить в обычный режим- implementation
-
- uses
- NsThreadList;
-
- procedure TNsThread.Execute;
- begin
- while True do
- begin
-
- if Terminated Then Terminate;
- end;
- end;
Примечание #1 (6 декабря 2008, 13:50): В приложении не Terminate, а Exit. Извиняюсь.
 |
Вопрос задал: Nasgool (статус: 2-ой класс)
Вопрос отправлен: 6 декабря 2008, 13:43
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 7 декабря 2008, 12:11; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 6 декабря 2008, 18:25 [#1]:
Плохое это дело - связывать потоки и VCL часть. Вначале кажеться все просто, но потом начитают лезть проблемы - надо очень аккуратно всё синхронизировать. Почему - это тема долгого разговора, просто поверьте. Если хочеться разобраться - читайте Рихтера (автор такой, но там уровень высокий).
Поэтому лучше создать класс-массив (с надёжной синхронизацией) или использововать готовый - TThreadList.
Заменять метод Execute тоже не обязательно - никто не мешает его сделать абстрактным и наследоваться от него.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: 2-ой класс), 7 декабря 2008, 12:11 [#4]:
комментарий был написан через минуту после вопроса ))
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|