С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
11 / 11 / 9
Регистрация: 26.08.2011
Сообщений: 177

Разом уничтожить все потоки

14.06.2016, 13:15. Показов 1639. Ответов 10

Студворк — интернет-сервис помощи студентам
Всем привет! Создаю несколько потоков таким образом:
C++
1
2
3
4
5
6
7
8
9
10
int i = 0;
    for (Form3->ADOQuery1->First(); !Form3->ADOQuery1->Eof; Form3->ADOQuery1->Next()){
        ArrayThread[i] = new SpyThread(ADOQuery1->FieldByName("SOURCE_DIRECTORY")->AsString, ADOQuery1->FieldByName("DESTINATION_DIRECTORY")->AsString, ADOQuery1->FieldByName("LID")->AsString);
 
        i++;
       }
       for(int n = 0; n<i; n++){
       ArrayThread[n]->Start();
       ArrayThread[n]->FreeOnTerminate = true;
       }
Вопрос: нигде ли я не ошибся?
И как мне потом разом убить все эти потоки?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.06.2016, 13:15
Ответы с готовыми решениями:

Как остановить все потоки разом?
вот код программы после запуска с помощью левой кнопки мыши я создаю потоки(шарики) и с помощью правой кнопки мыши надо остановить все...

Многопоточность. Как остановить все потоки разом?
Сделал как тут: http://avtuh.ru/2010/10/10/delphi-videourok-mnogopotochnost-i-sinxronizaciya.html Как можно остановить разом все потоки?

Напечатать все слова, которые отличаются от последнего, но предварительно надо уничтожить из них все последующие вхождения первой буквы
Дано рядок символів,який складається з окремих слів,відокремлених пробілом. Після останнього слова стоїть крапка. Надрукувати всі слова,які...

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
14.06.2016, 13:45
Ты бы для себя решил, или FreeOnTerminate = true, значит поток будет уничтожаться сам, когда закончит выполнение, либо false, и тогда тебе нужно удалять потоки вручную. А перемешивать эти подходы не нужно. Глюками чревато.
0
11 / 11 / 9
Регистрация: 26.08.2011
Сообщений: 177
14.06.2016, 14:02  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Ты бы для себя решил, или FreeOnTerminate = true, значит поток будет уничтожаться сам, когда закончит выполнение, либо false, и тогда тебе нужно удалять потоки вручную. А перемешивать эти подходы не нужно. Глюками чревато.
Понял. Предположим будем использовать false, т.к. мне необходимо при определенных условиях перезапускать потоки по нажатию кнопки. Т.е. задумка такая, потоки постоянно выполняются мониторя директории на наличие новых файлов, но при нажатии на кнопку (добавлении новой директории для мониторинга) все разом завершаются и создаются новые потоки (те же что были + новые)
Наверное не очень понятно объяснил...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
14.06.2016, 14:12
Цитата Сообщение от rozalski Посмотреть сообщение
при нажатии на кнопку (добавлении новой директории для мониторинга) все разом завершаются и создаются новые потоки
Расскажи мне, зачем нужно останавливать поток, который мониторит папку, при добавлении другой папки для мониторинга, а потом опять его запускать? Пускай новый поток ей и занимается, старый как работал так и работает, что изменилось-то?
1
11 / 11 / 9
Регистрация: 26.08.2011
Сообщений: 177
14.06.2016, 14:16  [ТС]
Вот пытаюсь просто на кнопку остановить все потоки:
C++
1
2
3
4
5
int i = 0;
    for (Form3->ADOQuery1->First(); !Form3->ADOQuery1->Eof-1; Form3->ADOQuery1->Next()){
        ArrayThread[i]->Terminate();
        i++;
       }
Но потоки не завершаются...
Создание переписал так:
C++
1
2
3
4
5
6
7
8
int i = 0;
    for (Form3->ADOQuery1->First(); !Form3->ADOQuery1->Eof; Form3->ADOQuery1->Next()){
        ArrayThread[i] = new SpyThread(ADOQuery1->FieldByName("SOURCE_DIRECTORY")->AsString, ADOQuery1->FieldByName("DESTINATION_DIRECTORY")->AsString, ADOQuery1->FieldByName("LID")->AsString);
  ArrayThread[i]->Start();
 ArrayThread[i]->FreeOnTerminate = false;
 
        i++;
       }
Добавлено через 3 минуты
Цитата Сообщение от volvo Посмотреть сообщение
Расскажи мне, зачем нужно останавливать поток, который мониторит папку, при добавлении другой папки для мониторинга, а потом опять его запускать? Пускай новый поток ей и занимается, старый как работал так и работает, что изменилось-то?
Логично, спасибо за мысль.
Но все же из спортивного интереса как завершить потоки?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
14.06.2016, 14:21
Завершить - вызывая для каждого потока Terminate(), которая переключит свойство Terminated в true, и метод Execute твоего потока завершится. По хорошему, надо еще дождаться завершения, через WaitFor(), но я не помню, было ли оно в BCB6

Добавлено через 1 минуту
Цитата Сообщение от rozalski Посмотреть сообщение
Но потоки не завершаются...
Внутри метода Execute точно есть проверка, не переключилось ли Terminated в true, и завершение работы метода в этом случае?
0
11 / 11 / 9
Регистрация: 26.08.2011
Сообщений: 177
14.06.2016, 14:43  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
По хорошему, надо еще дождаться завершения, через WaitFor(), но я не помню, было ли оно в BCB6
Вот тут хотелось бы поподробнее, если можно пример как ожидать завершения?
Цитата Сообщение от volvo Посмотреть сообщение
Внутри метода Execute точно есть проверка, не переключилось ли Terminated в true, и завершение работы метода в этом случае?
Нет, такой проверки нет, как я понимаю проверяется так:
C++
1
if(поток->Terminate==true)
А корректное завершение метода как будет выглядеть?

Добавлено через 50 секунд
Этот код не работает потому что я не обрабатываю сигнал Terminate в Execute?
C++
1
2
3
4
5
int i = 0;
    for (Form3->ADOQuery1->First(); !Form3->ADOQuery1->Eof-1; Form3->ADOQuery1->Next()){
        ArrayThread[i]->Terminate();
        i++;
       }
не завершает запущенные потоки?

Добавлено через 10 минут
Т.е. для завершения потока мне необходимо сделать проверку послана ли ему команда Terminate и что-то делать еще? Я правильно понимаю?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
14.06.2016, 15:18
Цитата Сообщение от rozalski Посмотреть сообщение
Нет, такой проверки нет, как я понимаю проверяется так:
А между тем, я тебе показывал именно с такой проверкой: Мониторинг директории и копирование только новых файлов (на 22-ю строку обрати внимание)

Цитата Сообщение от rozalski Посмотреть сообщение
Вот тут хотелось бы поподробнее, если можно пример как ожидать завершения?
Проверил в BCB6, все нормально, есть этот метод:
C++
1
2
3
4
5
    for (int i = 0; i < threadsCount; ++i) // где threadsCount - количество запущенных потоков
    {
        ArrayThread[i]->Terminate();
        ArrayThread[i]->WaitFor(); // Ожидаем завершения потока
    }
1
11 / 11 / 9
Регистрация: 26.08.2011
Сообщений: 177
14.06.2016, 15:26  [ТС]
Спасибо за помощь! Попытаюсь реализовать добавление нового потока не трогая уже запущенные. Как получить количество уже запущенных потоков? Есть ли специальная функция?
Еще вопросик не большой. Нормально ли, что приложение потребляет до 100% ресурсов CPU? Я так понимаю это нормально для потоков?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
14.06.2016, 16:00
Цитата Сообщение от rozalski Посмотреть сообщение
Как получить количество уже запущенных потоков? Есть ли специальная функция?
Нет, откуда? Потоки - твои, тебе и считать, сколько их запущено. Ну, или сделать статическое поле класса SpyThread, которое будет увеличиваться на 1 в конструкторе, и уменьшаться на 1 в деструкторе. Это и будет число запущенных и не завершенных потоков.
Цитата Сообщение от rozalski Посмотреть сообщение
Нормально ли, что приложение потребляет до 100% ресурсов CPU?
Не совсем. Я бы попробовал добавить Sleep, чтобы снизить нагрузку на процессор. Кстати, сколько ядер у тебя, и сколько потоков создает приложение?
1
11 / 11 / 9
Регистрация: 26.08.2011
Сообщений: 177
15.06.2016, 12:01  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Не совсем. Я бы попробовал добавить Sleep, чтобы снизить нагрузку на процессор. Кстати, сколько ядер у тебя, и сколько потоков создает приложение?
Ядра два, а приложение может создавать потоков сколько угодно, тестировал с 3 потоками...

Добавлено через 21 минуту
Цитата Сообщение от volvo Посмотреть сообщение
А между тем, я тебе показывал именно с такой проверкой: Мониторинг директории и копирование только новых файлов (на 22-ю строку обрати внимание)
Да, проверка пока не terminate у меня есть, но вот почему-то они все равно не останавливались, ну да ладно.
В общем добавление нового потока при добавлении новой директории для мониторинга я сделал, все вроде работает как надо. Количество запущенных потоков я подсчитываю, все вроде хорошо. Однако как решить обратную задачу? Как мне при удалении директории остановить именно тот поток, который за ней смотрел?

Добавлено через 20 минут
Удаление мониторинга и останов потока сделал так:
C++
1
2
int cThdel=DBGrid1->DataSource->DataSet->RecNo-1;
ArrayThread[cThdel]->Terminate();
Вроде работает...
Подскажите как используя Sleep() снизить нагрузку?

Добавлено через 26 минут
Попробовал так:
C++
1
2
3
4
5
while(!Terminated)
{
........
Sleep(100)
}
Наблюдаю....

Добавлено через 18 часов 43 минуты
Всем привет!
Итоги вчерашних изысканий.
C++
1
2
3
4
5
while(!Terminated)
{
........
Sleep(100)
}
позволило снизить нагрузку примерно в 5 раз.
решение по удалению
C++
1
2
int cThdel=DBGrid1->DataSource->DataSet->RecNo-1;
ArrayThread[cThdel]->Terminate();
выдавало ошибку если попытаться удалить только что созданный поток, т.е. работало корректно только если добавить поток, перезапустить приложение и только потом удалить этот поток. В этой связи обзавелось костылем в виде try - cath и функции по перезапуску приложения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2016, 12:01
Помогаю со студенческими работами здесь

Исчезли разом все диски hdd
здравствуйте, помогите пожалуйста. На рабочем компе при очередного включения исчезли разом все диски hdd . Было 2 ide подключено и один...

Отметить все элементы разом (CheckListBox)
В общем, нужно программно поставить галочки (или убрать их) на всех элементах CheckListBox сделал так: for i := 0 to...

Проверяем все значения массива разом
всем привет. Мне нужно узнать все элементы массива bool переменных разом. Цикл for не катит. так как мне нужно перебрать все строки...

Можно ли разом прекратить все незавершенные процессы
Закрываю приложение, а в какой-нибудь процесс в отдельном потоке продолжает жить, что видно в диспетчере задач. Можно ли как-то...

Перемещать не все фигуры разом, а только одну
всем доброго времени суток! пытаюсь сделать следующее: в окне создать фигуру квадрат и перемещать его с клавы. это получилось, при условии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru