| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Снова о потоках и окне прогресса. |
| Автор: JSinx 1.11.2008, 16:03 | ||
| Не могу понять как сделать правильно :( Есть функция обработки данных, при обработке в окне прогресса должно показываться текущие состояние обработки, выводить различные сообщения (в memo). Так же есть 2 кнопки Пауза/Продолжить и Остановить. Сделал я так. В функции обработки данных вызывается метод, в который передается сообщение в лог (если нужно) и процент обработки.
Собственно вопросы: 1) Правильный ли у меня подход или нет? 2) При нажатии кнопки Пауза я делаю suspend, но у меня тогда и окно программы не прорисовывается :( соответственно не могу нажать кнопку продолжить. Что нужно сделать, чтобы приостановить поток, и потом продолжить его работу |
| Автор: Alexeis 3.11.2008, 11:07 |
| Так все вроде верно. Так зачем же усыплять главный поток? Или так происходит во время синхронизации? По мне лучше усыплять в строго заданные моменты. Например воспользоваться эвентом. Или отправить сообщение второму потоку мол остановись. Когда второй поток получит его, то в ответ пошлет сообщения "Я остановился" при помощи SendMessage. До тех пор пока главный поток не скажет что сообщение обработано второй уснет. Или главный займет критическую секцию, а второй заблокируется на входе в нее. Общий принцип таков. 1й поток: "2й замри" 1й поток: "Жду пока второй замрет" 2й поток: "Получил команду замри" 2й поток: "Завершаю основной цикл действий, Готовлюсь к переходу в режим ожидания" 2й поток: "1му я замер" 2й поток: "Заблокировался" 1й поток: "Дождался пока 2й уснет, продолжаю работу" |
| Автор: JSinx 9.11.2008, 23:15 | ||||||||
Немного не понял, как сказать 2му замереть и подождать, может побольше документации надо почитать Пока что я сделал так: добавил флаг пауза, и проверяю его в функции обработки данных, и если он установлен, то вызывается sleep().
При нажатии на кнопку "пауза" устанавливается в true этот флаг и трэду делается suspend. Правда, мне кажется, в таком случае нет смысла делать треду Suspend, т.к. и так впадаем в цикл, который ничего не делает.
P.S. Так же такой код работает, если при установке флага Pause, не "впадать" в цикл, а просто проверить условие:
Трэд тоже suspend'иться |