|
Вопрос # 4 640/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Есть цепь потоков со схемой 3,1,3,2,2 в них чисто математические вычисления, по окончанию работы поток сохраняет результат и ожидает завершение параллельного потока для продолжения цепи потоков. Потоки работают отлично и по окончании работы каждый из потоков освобождает ресурсы. Но проблема в том, как осуществить возможность приостановки одного из потоков вручную т.к. кнопки для этого установлены, progressbarы стоят для отображения програсса каждого из потоков. Как организовать синхронизацию с формой?
При использовании 3-х потоков, но без использования команд
WaitFor и FreeOnTerminate:=True; Ими можно управлять, но при их использовании это становится невозможным.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: prorok-kane (статус: Посетитель)
Вопрос отправлен: 8 октября 2010, 00:04
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 8 октября 2010, 15:15; участников в обсуждении: 3.
|
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™ (статус: Доктор наук), 8 октября 2010, 11:08 [#4]:
Хорошо, что я не смотрел!
Жуть какая...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
prorok-kane (статус: Посетитель), 8 октября 2010, 14:44 [#5]:
У меня с потоками опыта очень мало и поэтому не могли бы вы
показать как в моём коде это все реализовать?
Допустим на примере первых 3-х потоков.
|
|
min@y™ (статус: Доктор наук), 8 октября 2010, 14:50 [#6]:
Цитата (prorok-kane):
У меня с потоками опыта очень мало и поэтому не могли бы вы показать как в моём коде это все реализовать?
Помоги себе сам и опыт появится. Напиши тестовую прогу с одним побочным потоком и попробуй правильно им рулить с помощью методов Suspend(), Resume(), Synchronize().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 8 октября 2010, 15:15 [#7]:
Посмотрите мою статью Скачиваем файлы из интернета - там есть хороший пример работы с потоком, которому нужно обновлять элементы на форме
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|