|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
23.08.2009, 21:03 | #1 |
Форумчанин
Регистрация: 22.06.2009
Сообщений: 310
|
Ожидание завершения потоков
Структура программы такая:
Код:
Как это лучше реализовать? |
23.08.2009, 21:17 | #2 |
Форумчанин
Регистрация: 06.01.2009
Сообщений: 340
|
С данной задачей вполне справятся семафоры.
Тебе нужна идея или пример привести?
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник". |
23.08.2009, 21:33 | #3 |
Форумчанин
Регистрация: 22.06.2009
Сообщений: 310
|
лучше пример, если можно)))
причем важно, чтобы программа не зависала, пока ждала завершения потоков |
23.08.2009, 22:10 | #4 | |
Форумчанин
Регистрация: 06.01.2009
Сообщений: 340
|
Пример я сейчас набросаю.
Цитата:
Достаточно прогрессбара или необходимо, чтобы была полная работоспособность (окна не подвисали)? Можешь немного рассказать о решаемой задаче, чтобы было яснее. Чтобы ничего не подвисало, можно ожидание вынести также в отдельный поток, тогда будет то, что тебе нужно.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник". |
|
23.08.2009, 22:25 | #5 | |
Форумчанин
Регистрация: 22.06.2009
Сообщений: 310
|
Я, кстати, делал так (не ругать))):
Код:
Хотя если пишу while true do Application.ProcessMessages; то ничего не стопорится. Но естественно, что такой вариант не подходит)) Цитата:
Проблема возникла как раз из-за того, что вдруг перестало работать моё "очевидное" решение. А так оно меня вполне устраивало)) Последний раз редактировалось Voody; 23.08.2009 в 22:27. |
|
23.08.2009, 23:15 | #6 | |
Форумчанин
Регистрация: 06.01.2009
Сообщений: 340
|
Вот пример.
Если что не так, пиши, доработаю. Цитата:
Но, конечно лучше через ожидание событий.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник". Последний раз редактировалось Daramant; 23.08.2009 в 23:19. |
|
24.08.2009, 00:27 | #7 |
Форумчанин
Регистрация: 22.06.2009
Сообщений: 310
|
Спасибо большое. Сделал так:
N - количество потоков, задает пользователь Код:
Первая проблема: программа виснет, если стоит INFINITE. Но... вторая проблема: вместо INFINITE поставил 1000 (как я понял, это интервал проверки семафора). Всё равно продолжает выполнятся вторая часть кода, не ожидая завершения потоков((( В том, то и дело, что программа раньше работала, а сейчас нет, и даже не доходит до изменения Next, просто стоит(( |
24.08.2009, 00:54 | #8 | |
Форумчанин
Регистрация: 06.01.2009
Сообщений: 340
|
WaitForSingleObject(). Ожидает пока не освободится семафор.
Если стоит, например 1000, то будет секундное ожидание и начнется выполнение операторов после WaitForSingleObject(). Тебе необходимо INFINITE, ждать пока точно все не отработают. Цитата:
Класс CheckThread сам писал или это потомок от класса tthread из Delphi? Переменная Semaphore точно глобальная?
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник". |
|
24.08.2009, 14:55 | #9 | |
Форумчанин
Регистрация: 22.06.2009
Сообщений: 310
|
Цитата:
Код:
Не могли бы вы привести более наглядный пример, например: нажимается кнопка - запускаются потоки - изменяется Label - завершаются потоки - что-то еще происходит после завершения (типа пишет "Программа закончена"). Тогда уже я сам разберусь |
|
24.08.2009, 17:44 | #10 |
Форумчанин
Регистрация: 06.01.2009
Сообщений: 340
|
Вот новая версия.
P.S. Если из потоков интенсивно изменять значения компонент на форме, то форма все равно подвисает. Можно, конечно, поставить Application.ProcessMessages; после каждого Label.Caption := 'текст';, но тогда упадет скорость выполнения рассчетов в потоках.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник". Последний раз редактировалось Daramant; 24.08.2009 в 20:27. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ожидание внутри процедуры | Juffin | Общие вопросы Delphi | 5 | 01.06.2009 13:52 |
Отображение текста до завершения скрипта | Black_Parrot | JavaScript, Ajax | 5 | 05.12.2008 16:59 |
Ожидание окончания вызванного процесса | Johnson | Win Api | 11 | 16.07.2008 23:11 |
Перехват завершения работы ОС | vynt | Win Api | 7 | 19.05.2008 08:59 |
Ждать завершения чужого процесса | ERASERROR | Win Api | 2 | 04.02.2008 08:23 |