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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 640

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!
Есть цепь потоков со схемой 3,1,3,2,2 в них чисто математические вычисления, по окончанию работы поток сохраняет результат и ожидает завершение параллельного потока для продолжения цепи потоков. Потоки работают отлично и по окончании работы каждый из потоков освобождает ресурсы. Но проблема в том, как осуществить возможность приостановки одного из потоков вручную т.к. кнопки для этого установлены, progressbarы стоят для отображения програсса каждого из потоков. Как организовать синхронизацию с формой?
При использовании 3-х потоков, но без использования команд
WaitFor и FreeOnTerminate:=True; Ими можно управлять, но при их использовании это становится невозможным.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1.  


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

Вопрос задал: prorok-kane (статус: Посетитель)
Вопрос отправлен: 8 октября 2010, 00:04
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 7; последнее сообщение — 8 октября 2010, 15:15; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 8 октября 2010, 08:20 [#1]:

Цитата (prorok-kane):

как осуществить возможность приостановки одного из потоков вручную

А что, в Delphi 2010 методы TThread.Suspend() и TThread.Resume() отменили?

Цитата (prorok-kane):

Как организовать синхронизацию с формой?

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

Вадим К (статус: Академик), 8 октября 2010, 10:23 [#2]:

метод Suspend лучше применять с самого треда, а не с другого. Иначе результат может быть плачевным (тред может остановиться посредине вычислений). А вот Resume - можно везде.
Что бы управлять этими тредами, можно применить две методики.
первый подход заключается в том, что после запуска, главный тред (там где находиться форма) не ждет их завершения "активно", через WaitForMultimplyObject (вроде так она называется, ждет завершения множества событий). А каждый тред посылает через PostMessage|SendMessage событие - "я завершился". Главная форма конечно в курсе, сколько тредов она запустила и подсчитывает ответы. Как только получены все - запускает новую порцию.
Также треды могут по ходу работы присылать промежуточные результаты. Методом SendMessage можно даже присылать указатель/ссылку на внутренние объекты треда и даже модифицировать:) (но только аккуратно).
Второй метод заключается в том, что бы для управления этими тредами мы заводит ещё один, управляющий тред. Теперь метод WaitFor не будет тормозить интерфейс:)
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 8 октября 2010, 11:01 [#3]:

посмотрел сорцы.... ужаснулся
код
Form1.ProgressBar7.Position:=i;
Synchronize(Form1.Show);
Такое писать, да ещё в цикле... НЕЛЬЗЯ ТАК!
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 8 октября 2010, 11:08 [#4]:

Хорошо, что я не смотрел!
Жуть какая...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
prorok-kane

prorok-kane (статус: Посетитель), 8 октября 2010, 14:44 [#5]:

У меня с потоками опыта очень мало и поэтому не могли бы вы
показать как в моём коде это все реализовать?
Допустим на примере первых 3-х потоков.
min@y™

min@y™ (статус: Доктор наук), 8 октября 2010, 14:50 [#6]:

Цитата (prorok-kane):

У меня с потоками опыта очень мало и поэтому не могли бы вы показать как в моём коде это все реализовать?

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

Вадим К (статус: Академик), 8 октября 2010, 15:15 [#7]:

Посмотрите мою статью Скачиваем файлы из интернета - там есть хороший пример работы с потоком, которому нужно обновлять элементы на форме
Галочка "подтверждения прочтения" - вселенское зло.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 12 августа 2020, 09:37
Выполнено за 0.02 сек.
Рейтинг@Mail.ru